如何在收到异步函数回调之前hibernate一个线程?

我有一个只有在从异步函数收到回调时才需要执行的函数。

喜欢

我调用异步函数Stop() ,不久之后我调用异步函数Start()

收到Stop CallBack之前的问题调用Start()被调用,因此我遇到了问题。 另外我无法分开两个函数的调用,就像我不能这样做:

 public void SomeFunction() { Stop(); } public void Stop_CallBack(eventargs e) { Start(); } 

我必须这样做:

 public void SomeFunction() { Stop(); //Do something; Start(); } 

但在我收到停止回叫之前,我的start()函数被执行,从而为我创造了问题。

任何人都可以帮助我如何解决这个问题。

这是您想要使用等待句柄的时候。 这是一个简短的代码示例,以显示一种方法:

 class AsyncDemo { AutoResetEvent stopWaitHandle = new AutoResetEvent(false); public void SomeFunction() { Stop(); stopWaitHandle.WaitOne(); // wait for callback Start(); } private void Start() { // do something } private void Stop() { // This task simulates an asynchronous call that will invoke // Stop_Callback upon completion. In real code you will probably // have something like this instead: // // someObject.DoSomethingAsync("input", Stop_Callback); // new Task(() => { Thread.Sleep(500); Stop_Callback(); // invoke the callback }).Start(); } private void Stop_Callback() { // signal the wait handle stopWaitHandle.Set(); } } 

由于这些看起来像成员函数,您可以添加一个事件成员变量( ManualResetEventAutoResetEvent 。然后在Stop()方法中将事件设置为发信号。在调用Stop()和Start()之间等待为了这个活动。

 private AutoResetEvent _stopped = new AutoResetEvent(false); public void SomeFunction() { Stop(); _stopped.WaitOne(); Start(); } 

在停止function中你会这样做

 private void Stop() { try { // Your code that does something to stop } finally { _stopped.Set(); // This signals the event } } 

如果使用ManualResetEvent

 private ManualResetEvent _stopped = new ManualResetEvent(false); public void SomeFunction() { Stop(); _stopped.WaitOne(); Start(); } private void Stop() { try { // Your code that does something to stop } finally { _stopped.Set(); // This signals the event } } private void Start() { _stopped.Reset(); // Your other start code here }