c# - C# await Task.Run 不等待
问题描述
我有一些长期运行的后台计算任务
private async void StartButton_onClick(object sender, RoutedEventArgs e)
{
cts = new CancellationTokenSource();
var task = Task.Run(() => Calculate(cts.Token));
tasks.Add(task);
await task;
tasks.Remove(task);
cts = null;
}
当用户点击Cancel
按钮时任务可以被取消,当用户调用其他活动时应该自动取消,比如按下Change
按钮打开一个对话框来更改计算参数。
为了避免为这两个操作编写两次取消代码,我将其移至单独的方法
public async void CancelAsync()
{
if (cts != null && !cts.IsCancellationRequested)
{
cts.Cancel();
await Task.WhenAll(tasks);
}
}
并从按钮单击事件中调用它
private async void CancelButton_onClick(object sender, RoutedEventArgs e)
{
await Task.Run(() => CancelAsync());
}
private async void ChangeButton_onClick(object sender, RoutedEventArgs e)
{
await Task.Run(() => CancelAsync());
OpenDialog();
}
问题是该OpenDialog()
方法在运行完成之前被调用。 CancelAsync()
请问我这里有什么问题吗?
解决方案
由于您从非异步也非等待的 lambda 调用 CancelAsync(),因此 lambda 将在CancelAsync()
方法返回之前完成。为了使其按预期用途工作
public async Task CancelAsync()
{
if (cts != null && !cts.IsCancellationRequested)
{
cts.Cancel();
await Task.WhenAll(tasks);
}
}
await CancelAsync();
推荐阅读
- c# - 如何使用 SSH 配置 MySql NET 连接器(在 MySql Workbench 中具有工作连接)
- python - Matplotlib 线图线颜色按组
- python - 为什么我尝试在 python 中使用 .get_text() 和漂亮的汤时出现错误?
- javascript - 如何在目标更改时保持源变量中的值(网格存储)
- performance - 如何提高性能并使我的颤振代码简洁?
- python - 如何更正 Xarray 数据集中的时间日历等坐标元数据属性?
- javascript - 对数组进行排序以首先具有重复项,然后对其他元素进行排序(均按降序排列)
- reactjs - 如何使用点击事件为条件渲染编写样式化组件?
- r - R中的非阻塞套接字?
- python - 如何仅在 django-rest-framework 中获取主键而不是所有结果的结果?