关于队列,线程和并发
新做了一个考勤系统,因为限制了只能在上班前一分钟以内,才能签到考勤,公司人不多,才600来个,可是每次都会在上班签到的时候,卡到不行。
想着用队列来控制,一分钟内的数据插入顺序,先把数据都存入队列,然后同多在Global文件中,添加一个timer,定时去判断队列是否为空,不为空就将数据插入到数据库。
1.考勤分时间段,这个时间段是可变的,所以我的timer只能设置为10分钟就检测一次,是否会太频繁?
2.队列的数据在新增的同时,逻辑在读取队列,线程是否是安全的,怎么控制?
3.600个左右的并发并不大,每天每人至少考勤四次,最多六次,是不是有其他没有注意的地方。数据库为oracle
4.暂时测试阶段,数据库存放在一台主机上,非服务器
从来没有做过,求高人指点,或者有更好的办法?
[解决办法]
额 这个还没有做过。。。。。。
友情帮顶~~
期待楼下解答。。。。
[解决办法]
using System;using System.Collections.Generic;using System.Windows.Forms;using System.IO;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Text;using System.Drawing;using System.Drawing.Imaging;using System.Drawing.Drawing2D;using System.Diagnostics;using System.Threading;using System.Runtime.InteropServices;namespace WindowsFormsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// 锁啊锁 /// </summary> private ReaderWriterLockSlim _RWLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); // 打卡队列 Queue<SigninInfo> _SigninQueue = new Queue<SigninInfo>(600); /// <summary> /// 打卡签到进入队列 /// </summary> /// <param name="obj"></param> private void Singin(Object obj) { while (true) { _RWLock.EnterWriteLock(); try { SigninInfo entity = new SigninInfo(); entity.EmployeeID = System.Environment.TickCount; entity.SigninTime = System.DateTime.Now; _SigninQueue.Enqueue(entity); } finally { _RWLock.ExitWriteLock(); System.Threading.Thread.Sleep(10); } } } /// <summary> /// 保存 /// </summary> /// <param name="obj"></param> private void Save(Object obj) { while (true) { _RWLock.EnterReadLock(); try { if (_SigninQueue.Count == 0) { continue; } SigninInfo entity = _SigninQueue.Dequeue(); System.Diagnostics.Debug.WriteLine(String.Format("员工ID={0},打卡时间={1}", entity.EmployeeID, entity.SigninTime)); } finally { _RWLock.ExitReadLock(); System.Threading.Thread.Sleep(10); } } } private void button1_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(new WaitCallback(Singin), null); ThreadPool.QueueUserWorkItem(new WaitCallback(Save), null); } } /// <summary> /// 打卡信息 /// </summary> public struct SigninInfo { public Int32 EmployeeID; public DateTime SigninTime; }}