簡體   English   中英

如何讓線程休眠,直到收到異步 function 的回調?

[英]How to Sleep a thread until callback for asynchronous function is received?

我有一個 function,只有在從異步 function 收到回調時才需要執行它。

喜歡

我調用異步 function Stop() ,不久之后我調用異步 function Start()

收到 Stop CallBack 之前的問題Start()被調用,因此我遇到了問題。 我也不能分開調用兩個函數就像我不能這樣做一樣:

public void SomeFunction()
{
    Stop();
}  

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

我必須這樣做:

public void SomeFunction()
{

  Stop();
  //Do something;

  Start();
}

但是在我收到 Stop 回調之前,我的 start() function 被執行,從而給我帶來了問題。

誰能幫我解決這個問題。

這是您想要使用等待句柄的時候。 這是一個簡短的代碼示例,用於展示一種方法:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM