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

时间:2011-06-10 12:11:45

标签: c# synchronization callback multithreading

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

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

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

public void SomeFunction()
{
    Stop();
}  

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

我必须这样做:

public void SomeFunction()
{

  Stop();
  //Do something;

  Start();
}

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

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

2 个答案:

答案 0 :(得分:20)

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

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

}

答案 1 :(得分:4)

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

private AutoResetEvent _stopped = new AutoResetEvent(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
    }
}

如果使用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
}