当前位置: 首页 > 编程语言 > C#

如何保证只有一个线程可以执行某些操作?分享

时间:2023-04-10 23:37:46 C#

我如何确保只有一个线程可以做某事?我有多个线程将项目添加到无锁队列。然后这些项目由另一个线程处理。在生产者线程中,我需要启动消费者线程,但前提是它尚未运行或启动。具体来说:publicvoidBeginInvoke(Actionmethod){//这在多个后台线程上运行pendingActions.Enqueue(method);if(ProcessQueuehasn'tbeenposted)uiContext.Post(ProcessQueue,null);}privatevoidProcessQueue(objectunused){//这在UI线程上运行。动作电流;while(pendingActions.TryDequeue(outcurrent))current();我使用的是.Net3.5,而不是4.0。?最简单的方法是使用信号量。它将计算队列大小。我创建了以下类来执行此操作:///确保代码块一次只执行一次。类阀门{intisEntered;//0表示错误;1true///尝试进入阀门。///如果阀门中没有其他线程则为真;如果阀门已经输入,则为false。publicboolTryEnter(){if(Interlocked.CompareExchange(refisEntered,1,0)==0)返回真;返回假;}///允许再次进入阀门。publicvoidExit(){调试。断言(isEntered==1);已输入=0;我这样使用它:readonlyValvevalve=newValve();publicvoidBeginInvoke(Action方法){pendingActions.Enqueue(方法);如果(valve.TryEnter())uiContext.Post(ProcessQueue,null);}privatevoidProcessQueue(objectunused){//这在UI线程上运行。Actioncurrent;while(pendingActions.TryDequeue(outcurrent))current();阀门.退出();这种模式安全吗?有没有更好的办法?这个类有更正确的名称吗?它能为您提供帮助吗?不稳定的int运行;//不是允许ProcessQueue可重入的布尔值。私人电话idProcessQueue(对象未使用){做{++running;动作电流;while(pendingActions.TryDequeue(outcurrent))current();-跑步;}while(pendingActions.Count!=0);}publicvoidBeginInvoke(Actionmethod){pendingActions.Enqueue(method);如果(运行!=0)uiContext.Post(ProcessQueue,null);}为消费者线程创建第二个Dispatcher生产者线程然后可以使用该调度器的BeginInvoke()方法将数据发送到消费者线程。Dispatcher的队列取代了pendingActions队列,并确保消费者线程一次只处理一个工作项。不要让生产者线程尝试协调启动和停止消费者线程,只需在任何生产者启动之前启动消费者线程,并让它空闲。Dispatcher应该在需要时自动唤醒它。以上就是C#学习教程:如何保证只有一个线程可以执行某些操作?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: