Сделать синхронизацию асинхронного вызова - PullRequest
4 голосов
/ 10 декабря 2010

Я пытаюсь синхронизировать асинхронный вызов.

Обычный ( асинхронный ) поток выглядит следующим образом:

  1. Запрос данных на сервере с помощью telnet: 'Session.sendToTarget (message)'
  2. Приложение движется к другим вещам ....
  3. Когда ответ сервера готов, сервер отправляет результат.
  4. Приложение получит результат и вызовет событие «OnDataReceived»

Данные с сервера важны для следующего шага, поэтому я хочу хранить ВСЕ, пока они не будут получены.

Поток sync должен выглядеть следующим образом:

  1. Запрос данных на сервере: Session.sendToTarget (message)
  2. Дождаться получения данных с сервера

Используя c #, я безуспешно пытался синхронизировать операцию с WaitHandle.WaitOne (TimeToWaitForCallback). Похоже, что WaitOne остановил приложение для получения входящих сообщений (я также пытался подождать в других сообщениях) После истечения времени TimeToWaitForCallback я получаю входящее сообщение, которое было приостановлено действием 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 ]

2 голосов
/ 10 декабря 2010
    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

0 голосов
/ 10 декабря 2010

ниже линии

Обычный (асинхронный) поток выглядит так:

   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) синхронно. Нет смысла делать это асинхронным

0 голосов
/ 10 декабря 2010

ManualResetEvent действительно может помочь вам в этом случае.

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

...