Я использую шаблон async/await во всем своем коде. Однако есть один API, который использует асинхронный шаблон на основе событий. Я читал в MSDN и несколько ответов StackOverflow, что способ сделать это - использовать TaskCompletionSource.
Мой код:
public static Task<string> Process(Stream data)
{
var client = new ServiceClient();
var tcs = new TaskCompletionSource<string>();
client.OnResult += (sender, e) =>
{
tcs.SetResult(e.Result);
};
client.OnError += (sender, e) =>
{
tcs.SetException(new Exception(e.ErrorMessage));
};
client.Send(data);
return tcs.Task;
}
И называется как:
string result = await Process(data);
Или, для тестирования:
string result = Process(data).Result;
Метод всегда возвращается очень быстро, но ни одно из событий не запускается.
Если я добавлю tcs.Task.Await(); непосредственно перед оператором return он работает, но это не обеспечивает асинхронного поведения, которого я хочу.
Я сравнил с различными образцами, которые я видел в Интернете, но не вижу никакой разницы.
tcs.Task.Await()
? Нет такого метода. - person usr   schedule 05.12.2015