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

Sum*_*mit 8 c# multithreading synchronization callback

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

喜欢

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

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

public void SomeFunction()
{
    Stop();
}  

public void Stop_CallBack(eventargs e)
{
    Start();
}
Run Code Online (Sandbox Code Playgroud)

我必须这样做:

public void SomeFunction()
{

  Stop();
  //Do something;

  Start();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Fre*_*örk 21

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • @Daniel:*我*不需要它;但是问题指出*“ [...]函数仅在收到回调时需要执行[...]” *,并且OP在给定的代码示例中已经建议了这样的回调。我倾向于尽可能少地重组OP代码。可能是从无法访问等待句柄的第3方代码调用了该回调。 (2认同)
  • @Sumit:我的样本中的`Task`仅用于拥有完整的样本.如果我理解正确的话,你在调用异步库方法时将`Stop_Callback`作为参数传递,该方法在完成后调用该方法?如果是这样,我的示例仍然有效,只是您将调用该异步方法而不是执行任务. (2认同)