我正在使用一个通常异步显示的alert 窗口(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.我正在寻找一个不同的解决方案.

推荐答案

该方法可以更改为:

public Task ShowAlert(object message, string windowTitle)

Task<bool>继承自Task,因此您可以返回Task<bool>,同时只向调用者公开Task

Edit:

我发现了一个微软的文档,Stephen Toub写的,名为"基于任务的异步模式",其中有一段摘录推荐了同样的模式.

There is no non-generic counterpart to TaskCompletionSource<TResult>. However, Task<TResult> derives from Task, and thus the generic TaskCompletionSource<TResult> can be used for I/O-bound methods that simply return a Task by utilizing a source with a dummy TResult (Boolean is a good default choice, and if a developer is concerned about a consumer of the Task downcasting it to a Task<TResult>, a private TResult type may be used)

.net相关问答推荐

.NET MAUI 的登录页面

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

在 C# 中输入按键

使用返回随机结果的函数进行单元测试

使用 C# 清除文本文件的内容

SubscribeOn 和 ObserveOn 有什么区别

.Net 中的 Decimal.One、Decimal.Zero、Decimal.MinusOne 的用途是什么

读取方法的属性值

C# 的浮点比较函数

在 C# 中与块等效?

.Net 正则表达式:单词字符 \w 是什么?

获取磁盘上文件的大小

C# List<> 按 x 然后 y 排序

具有不同身份验证标头的 HttpClient 单个实例

记录器包装器最佳实践

多个列表与 IEnumerable.Intersect() 的交集

在 C#/.NET 中合并两个图像

如何使用 AutoMapper .ForMember?

SqlParameter 已被另一个 SqlParameterCollection 包含 - using() {} 作弊吗?