如何等到方法开始和完成?

Posted

技术标签:

【中文标题】如何等到方法开始和完成?【英文标题】: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

实现这一目标最聪明的方法是什么?

【问题讨论】:

看AutoResetEvent。它是为这类事情而设计的,MSDN 上也有示例。 Mutex 怎么样? 您可以在***.com/questions/1584062/…得到答案 ***.com/questions/1784928/… 【参考方案1】:

使用AutoResetEventManualResetEvent

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);

【讨论】:

以上是关于如何等到方法开始和完成?的主要内容,如果未能解决你的问题,请参考以下文章

如何等到吐司完成?仅在 toast 隐藏 prev 测试后才开始第二次测试

如何使测试方法等到委托完成处理?

如何让一个方法等到另一个方法完成它在Objective C中工作?

如何等到异步任务中另一个类的方法在android中完成

等到tomcat完成启动

UIViewController动画等到动画完成