Мои знания о том, как работают методы 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();
}
Я уверен, что это будет выглядеть уродливым для всех, кто когда-либо выполнял какое-либо асинхронное/ждущее программирование на основе задач, но я нахожусь на правильном пути для этого? Кажется, что я исправил проблему, связанную с событием ручного сброса, и теперь я могу запустить этот метод несколько раз асинхронно. :)
Как я могу использовать 'Task.Factory.FromAsync' с парами событий асинхронных методов, сгенерированными ссылкой Add Service Reference в переносимой библиотеке классов? Поскольку эти методы не возвращают 'IAsyncResult' или тому подобное. – rtlayzell
Если у вас есть события, используйте 'TaskCompletionSource'. [Как: Обратить шаблоны EAP в задаче] (http://msdn.microsoft.com/en-us/library/ee622454 (v = vs.110) .aspx). – Noseratio