我在整个代码中使用异步/等待模式。但是,有一个 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 语句之前,它可以工作,但这并没有提供我想要的异步行为。
我已经与我在互联网上看到的各种样本进行了比较,但没有发现任何差异。