C#多个线程执行同一个方法,如何实现类似队列形式的一个一个的执行,防止同一时间被多个线程执行,因为这个方法设计到与外部通信,每个信号都需要4s之内给予回复,求有解决方法的人顶楼
解决方案 »
- 如何向线程里面增加一个要执行的方法
- 帮忙找一下错误,不可思议!
- winForm的问题
- 请教页面加载问题
- 双击datagridview一行如何弹出一个窗口,显示这行的详细信息?
- 孟子,,小山,,大会狼,,救我。。。使用用户控件如何才能获得其所在.aspx中的WEB窗体ID呢?
- C#有关Socket问题,客户端发送信息到服务端,建立连接后,请问怎样发送到指定服务器上的web脚本?
- socket程序 在服务器端怎样能知道客户端异常断开?
- [UP有分解决即刻结帖]控件与数据正确绑定情况下调GetChanges()无法正确获得界面修改
- 在WEB页上显示可以画图的控件
- 高分求助,采用C#实现以下加解密的方法
- C#上位机和松下PLC通讯异常
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
static object lockObj = new object();
public void Communicate()
{
lock (lockObj)
{
DoCommunicate();
}
}
...
ProcessQueue.Add(new HttpApiUploadInfo
{
...
});
... void StartHttpApiInterfaceCommitLoop()
{
ThreadPool.QueueUserWorkItem(obj =>
{
while (true)
{
foreach (HttpApiUploadInfo uploadInfo in ProcessQueue.GetConsumingEnumerable())
{
Thread.Sleep(100); CurrentHttpAPITaskCount = ProcessQueue.Count(); if (uploadInfo.uploadStyle == EHttpApiUploadStyle.Packing)
{
...
}
}
}
});
}
{
ThreadPool.QueueUserWorkItem(obj =>
{
while (true)
{
foreach (HttpApiUploadInfo uploadInfo in ProcessQueue.GetConsumingEnumerable())
{
Thread.Sleep(100);
CurrentHttpAPITaskCount = ProcessQueue.Count();
if (uploadInfo.uploadStyle == EHttpApiUploadStyle.Packing)
{
// 开线程并行
new Thread(new ParameterizedThreadStart(ProcessPackingUpload)).Start(uploadInfo);
或
// 排队执行
ProcessPackingUpload
}
}
}
});
}
public void Communicate()
{
if (Monitor.TryEnter(lockObj, TimeSpan.FromSeconds(10)))
{
try
{
DoCommunicate();
}
finally
{
Monitor.Exit(lockObj);
}
}
else
{
// 获取锁失败
}
}
其实比较好的作法是2端通过消息队列来通信,这样不至于出现线程死锁 或 阻塞的问题。
消息队列是用来并发的,不是用来阻塞的。不要见到“队列”两个字儿就望文生义。对于.net 的进程内编程,“队列”这个词儿也是比较多余的。因为 .net 有很好的机制来直接用在线程同步上,或者线程池调度上,用不着自己发明什么简单队列(何况自己发明的机制还缺少基本功能)。
这种情况用严格的单例模式就好了:
https://www.cnblogs.com/xmfdsh/p/4036927.html
{
public void 投资(string 服务种类代码, .....)
{
.......
} public event Action<定时投资反馈Argument> Alert;
public class 定时投资反馈Argument
{
public ..... 时间;
public ..... 服务种类;
public .... 状态;
public .... Summary;
}
........
}那么这个投资行为里边的逻辑可能很复杂,里边可能会不定时地抛出业务事件。假设你说因为内部逻辑可能复杂、可能后期有变化,所以你就只能想到这种——所有的使用的用户端必须阻塞住“一个一个地执行”——的方式,这其实往往就降低了系统几十倍甚至上百倍效率,而且其实也不符合业务领域成熟的管理经验。就好像非常大的医院的取药窗口,肯定就比小社区医院更“聪明”一点,不会以排队为主,而是异步地交单、取药。
不过用Lock就可以了。
如果外部也是自己搞的,用消费者生产者模型就可以了吧,BlockingCollection 可以设置并行的线程数
不过如果我做这个,我用采用PLC思维,用Timer+Swith Case方式做轮询判断,第一个条件满足,再去反复判断下一个case。
这个方法不是我发明的,大家不要喷我,但这是一个好方法。