c# – 使异步调用同步

我试图同步异步调用.

常规(异步)流程如下所示:

>使用telnet向服务器请求数据:’Session.sendToTarget(message)’
>该应用程序继续做其他事情….
>当服务器应答就绪时,服务器发送结果.
>应用程序获取结果并引发事件“OnDataReceived”

来自服务器的数据对于下一步至关重要,所以我希望保持一切直到收到它为止.

同步流应如下所示:

>向服务器请求数据:Session.sendToTarget(message)
>等到从服务器收到数据

使用c#,我试图将操作与’WaitHandle.WaitOne(TimeToWaitForCallback)’同步失败,似乎WaitOne停止了接收传入消息的应用程序(我试过等待其他的thred). Afther TimeToWaitForCallback时间传递我得到了停止deu到WaitOne操作的传入消息.

我尝试使代码同步:

public virtual TReturn Execute(string message)
            {
                WaitHandle = new ManualResetEvent(false);
                var action = new Action(() =>
                                                 {
                                                     BeginOpertaion(message);
                                                     WaitHandle.WaitOne(TimeToWaitForCallback);
                                                     if (!IsOpertaionDone)
                                                         OnOpertaionTimeout();
                                                 });
                action.DynamicInvoke(null);
                return ReturnValue;
            }

传入此代码:

protecte protected void EndOperation(TReturn returnValue)
        {
            ReturnValue = returnValue;
            IsOpertaionDone = true;
            WaitHandle.Set();
        }

有任何想法吗?

最佳答案

    AutoResetEvent mutex = new AutoResetEvent(false);
    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate 
        { 
            Thread.Sleep(2000);
            Console.WriteLine("sleep over");
            mutex.Set(); 
        }));
    mutex.WaitOne();
    Console.WriteLine("done");
    Console.ReadKey();

当异步操作完成时,将mutex.Set()放到你的事件处理程序中…

ps:我喜欢线程动作符号:P

点赞