使异步调用同步

时间:2010-12-10 08:36:48

标签: c# asynchronous synchronization waithandle

我尝试同步异步调用。

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

  1. 使用telnet向服务器请求数据:'Session.sendToTarget(message)'
  2. 该应用继续做其他事情......
  3. 当服务器应答就绪时,服务器发送结果。
  4. 该应用获取结果并引发事件“OnDataReceived”
  5. 来自服务器的数据对于下一步至关重要,所以我想保留所有内容,直到收到它为止。

    同步流程应如下所示:

    1. 向服务器请求数据:Session.sendToTarget(message)
    2. 等到从服务器收到数据
    3. 使用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();
              }
      

      有什么想法吗?

3 个答案:

答案 0 :(得分:2)

    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

答案 1 :(得分:0)

在这种情况下,ManualResetEvent可以真正帮助你。

http://www.java2s.com/Tutorial/CSharp/0420__Thread/Useamanualeventobject.htm

答案 2 :(得分:0)

以下

  

常规(异步)流程如下:

   Asking the server for data using telnet: 'Session.sendToTarget(message)' 
   The app move on doing other things.... 
   When the server answer ready, the server send the result. 
   The app get the result and raise event "OnDataReceived" 

并将其转到以下

Asking the server for data: Session.sendToTarget(message) 
Wait until the data received from the server 

它与阻止请求一样好,所以只需同步调用Session.sendToTarget(message)。没有必要使它异步