【发布时间】:2014-11-23 17:13:01
【问题描述】:
我不知道如何以一种好的方式做到这一点。
基本上,我有一个包含两个关键任务的程序,其中包含循环运行,直到用户单击停止按钮。
伪代码:
- 任务 A 已启动:一个持续工作的 while 循环
- 任务 B 已启动:
System.Timers.Timer持续检查 针对特定条件 - 如果任务 B 发现条件为真,它应该暂时停止任务 A,并做一堆工作
- 一旦任务 B 完成该工作,它应该允许任务 A 再次开始循环,并返回检查特定条件
然后这一切将永远持续下去(直到用户单击停止按钮并且程序结束)。
当我对程序进行第一次迭代时,我基本上创建了两个单独的线程,然后在用于取消的循环中只添加了布尔值。因此,任务 B 只是将任务 A 中的布尔值设置为 false,并使用 Thread.Join() 等待任务 A 完全完成,然后再开始工作。任务 B 完成后,它又在一个全新的线程上创建了任务 A。这似乎非常低效,因为我没有理由真的不得不结束线程,而我只想停止它直到任务 B 完成。
我一直在通过任务并行库 (async-await) 阅读 async ops,并认为我可能可以使用取消令牌而不是布尔值,但看起来一旦使用取消令牌取消任务,令牌无法重置,也无法重新启动任务。
无论如何,您将如何构建它?
【问题讨论】:
-
使用 Mutex、ManuallyResetEvent、Semaphore 等同步机制
标签: c# multithreading asynchronous task-parallel-library async-await