2014-02-10 5 views
0

Мои знания о том, как работают методы async/await и на какой поток немного туманно. Я хотел бы заблокировать метод до тех пор, пока не будет запущено событие. Для этого я попытался использовать ManualResetEvent, однако это блокирует каждый вызов метода async до тех пор, пока не будет вызван последний waitHandle.Set(), после чего все методы async завершены (или, как кажется).Асинхронный метод блокировки вручную

Мне нужен способ блокировки async вызовов индивидуально, поскольку я пытаюсь преобразовать асинхронный подход, основанный на событиях, к Task на основе async/await.

Как я могу это сделать?

Update:

на основе информации, предоставленной Стивеном и Noseratio, я теперь изменил свои методы асинхронными к чему-то длинной линии этого:

public async Task<IEnumerable<CustomerNoteInfo>> LoadClientNotesAsync(int id) 
    { 
     return await _session.InvokeOperationAsync((client) => 
     { 
      var tcs = new TaskCompletionSource<IEnumerable<CustomerNoteInfo>>(); 
      client.GetCustomerNotesCompleted += (sender, e) => 
      { 
       if (e.Error != null) tcs.TrySetException(e.Error); 
       else tcs.TrySetResult(e.Result); 
      }; 

      client.GetCustomerNotesAsync(id); 
      return tcs.Task; 
     }).Unwrap(); 
    } 

Я уверен, что это будет выглядеть уродливым для всех, кто когда-либо выполнял какое-либо асинхронное/ждущее программирование на основе задач, но я нахожусь на правильном пути для этого? Кажется, что я исправил проблему, связанную с событием ручного сброса, и теперь я могу запустить этот метод несколько раз асинхронно. :)

+0

Как я могу использовать 'Task.Factory.FromAsync' с парами событий асинхронных методов, сгенерированными ссылкой Add Service Reference в переносимой библиотеке классов? Поскольку эти методы не возвращают 'IAsyncResult' или тому подобное. – rtlayzell

+1

Если у вас есть события, используйте 'TaskCompletionSource'. [Как: Обратить шаблоны EAP в задаче] (http://msdn.microsoft.com/en-us/library/ee622454 (v = vs.110) .aspx). – Noseratio

ответ

3

Мои знания о том, как работают асинхронные/ожидающие методы, и на какой поток немного туманно.

Я рекомендую вам начать с моего async intro, который охватывает ключевые слова и как они определяют, какой поток использовать.

Я пытаюсь преобразовать асинхронный подход, основанный на событии, к async/await, основанный на задаче.

MSDN documentation on this неплохо.

Вам не нужно блокировать метод async; просто создайте оболочку TAP (Task-based) для EAP (пара методов/событий). Затем вы можете просто вызвать свой метод TAP и вернуть await.

Смежные вопросы