关于队列,线程和并发

nmhyt 2012-07-04 03:29:11
新做了一个考勤系统,因为限制了只能在上班前一分钟以内,才能签到考勤,公司人不多,才600来个,可是每次都会在上班签到的时候,卡到不行。
想着用队列来控制,一分钟内的数据插入顺序,先把数据都存入队列,然后同多在Global文件中,添加一个timer,定时去判断队列是否为空,不为空就将数据插入到数据库。

1.考勤分时间段,这个时间段是可变的,所以我的timer只能设置为10分钟就检测一次,是否会太频繁?
2.队列的数据在新增的同时,逻辑在读取队列,线程是否是安全的,怎么控制?
3.600个左右的并发并不大,每天每人至少考勤四次,最多六次,是不是有其他没有注意的地方。数据库为oracle
4.暂时测试阶段,数据库存放在一台主机上,非服务器

从来没有做过,求高人指点,或者有更好的办法?
...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SocketUpEx 2012-07-04
  • 打赏
  • 举报
回复
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;
}
}
nmhyt 2012-07-04
  • 打赏
  • 举报
回复
难道没有人会数据列队、线程和并发么?
dx在那里呀。帮帮我吧。我不想加班呀~~~
nmhyt 2012-07-04
  • 打赏
  • 举报
回复
难道没有人会数据列队、线程和并发么?
dx在那里呀。帮帮我吧。我不想加班呀~~~
czy1919z 2012-07-04
  • 打赏
  • 举报
回复
额 这个还没有做过。。。。。。
友情帮顶~~
期待楼下解答。。。。

62,056

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧