我正在处理一个通常异步显示的警告窗口(Telerik WPF) (代码在打开时继续运行),我希望使用async/await使其同步。
我在TaskCompletionSource中使用了这个类,但是这个类是泛型的,它返回一个像Task<bool>这样的对象,而我想要的只是一个没有返回值的普通Task。
public Task<bool> ShowAlert(object message, string windowTitle)
{
var dialogParameters = new DialogParameters { Content = message };
var tcs = new TaskCompletionSource<bool>();
dialogParameters.Closed += (s, e) => tcs.TrySetResult(true);
RadWindow.Alert(dialogParameters);
return tcs.Task;
}调用该方法的代码是
await MessageBoxService.ShowAlert("The alert text.")如何返回一个功能类似的非泛型任务,该任务可以一直等到dialogParameters.Closed事件触发?我知道我可以忽略在这段代码中返回的bool。我正在寻找一个不同于此的解决方案。
发布于 2012-08-15 20:27:42
可以将该方法更改为:
public Task ShowAlert(object message, string windowTitle)Task<bool>继承自Task,因此您可以返回Task<bool>,同时只向调用者公开Task
编辑:
我发现了一个微软文档,http://www.microsoft.com/en-us/download/details.aspx?id=19957,作者Stephen Toub,标题是“基于任务的异步模式”,它有下面的摘录推荐了同样的模式。
没有TaskCompletionSource的非泛型对应项。然而,任务派生自任务,因此泛型TaskCompletionSource可用于I/O绑定方法,这些方法仅通过利用具有虚拟TResult的源返回任务(布尔值是一个很好的默认选择,如果开发人员担心任务的使用者将其转换为任务,则可以使用私有TResult类型)
发布于 2012-08-15 20:59:17
如果不想泄露信息,通常的方法是使用TaskCompletionSource<object>并以null作为结果。然后将其作为Task返回即可。
发布于 2020-08-12 16:20:08
.NET 5有一个非通用的TaskCompletionSource。
被添加到这个拉取请求中:https://github.com/dotnet/runtime/pull/37452/files#diff-4a72dcb26e2d643c337baef9f64312f3
https://stackoverflow.com/questions/11969208
复制相似问题