【问题标题】:How to wait until a method is started & finished?如何等到方法开始和完成?
【发布时间】:2014-07-17 07:10:19
【问题描述】:
我有在线程#1上运行的方法A。
我还有 方法 B,它在 线程 #2 上运行。
方法 A 将函数 C(接收对象值并返回布尔值的方法)写入共享对象,该函数应通过方法 B 在某些事件上执行。(方法 B 是永久运行的 TCP 侦听器方法)
我希望方法 A 等到该事件发生并且 C 完成。目前它使用基于睡眠的 for 循环(带有超时等)实现。
让我说清楚一点,流程是这样的:
方法 B(在线程 #2 上):while(true) { process data, if data has x then someFunc(..) }
方法 A(在线程 #1 上):someFunc = (obj) => {...};wait until someFunc is executed by B & is finished;do more stuff
实现这一目标最聪明的方法是什么?
【问题讨论】:
标签:
c#
multithreading
asynchronous
【解决方案1】:
使用AutoResetEvent 或ManualResetEvent
private AutoResetEvent signal = new AutoResetEvent(false);
void MethodB()
{
//process data
if(condition)
{
signal.Set();//Say you're finished
}
}
void MethodA()
{
//Do something
signal.WaitOne();//Wait for the signal
//Here do whatever you want. We received signal from MethodB
}
我推荐阅读http://www.albahari.com/threading/
【解决方案2】:
使用锁和 Monitor 类。
private object _lock = new object();
...
private void StartTaskAndWait()
{
lock (_lock)
{
new Task(DoSomething).Start();
Monitor.Wait()
}
}
在任务方法结束时使用 Pulse 来“唤醒”等待的线程。
lock (_lock)
{
Monitor.Pulse(_lock);
}