首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非通用TaskCompletionSource或替代方案

非通用TaskCompletionSource或替代方案
EN

Stack Overflow用户
提问于 2012-08-15 20:24:29
回答 5查看 26.4K关注 0票数 80

我正在处理一个通常异步显示的警告窗口(Telerik WPF) (代码在打开时继续运行),我希望使用async/await使其同步。

我在TaskCompletionSource中使用了这个类,但是这个类是泛型的,它返回一个像Task<bool>这样的对象,而我想要的只是一个没有返回值的普通Task

代码语言:javascript
复制
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;
}

调用该方法的代码是

代码语言:javascript
复制
await MessageBoxService.ShowAlert("The alert text.")

如何返回一个功能类似的非泛型任务,该任务可以一直等到dialogParameters.Closed事件触发?我知道我可以忽略在这段代码中返回的bool。我正在寻找一个不同于此的解决方案。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-15 20:27:42

可以将该方法更改为:

代码语言:javascript
复制
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类型)

票数 99
EN

Stack Overflow用户

发布于 2012-08-15 20:59:17

如果不想泄露信息,通常的方法是使用TaskCompletionSource<object>并以null作为结果。然后将其作为Task返回即可。

票数 56
EN

Stack Overflow用户

发布于 2020-08-12 16:20:08

.NET 5有一个非通用的TaskCompletionSource

被添加到这个拉取请求中:https://github.com/dotnet/runtime/pull/37452/files#diff-4a72dcb26e2d643c337baef9f64312f3

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11969208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档