【发布时间】:2022-01-03 12:08:47
【问题描述】:
我有 .NET 应用程序,我的 GUI 上有 DataGridView 和 TextBox。我想要做的是当用户更改 TextBox 文本时,更新包含此文本的单元格的 DataGridView。但是这个搜索应该作为异步任务运行,因为如果不是,它会导致 GUI 冻结。每次当用户更改 TextBox 文本时,如果另一个搜索任务正在运行,我的应用程序应该取消并再次重新运行它以根据新的搜索值进行搜索。这是我的代码;
CancellationTokenSource cts = new CancellationTokenSource();
private async void TextBox1_Changed(object sender, EventArgs e)
{
cts.Cancel();
CancellationToken ct = cts.Token;
try
{
await Task.Run(() =>
{
System.Diagnostics.Debug.WriteLine("Task started");
// Searching here.
System.Diagnostics.Debug.WriteLine("Task finished");
}, cts.Token);
}
catch
{
System.Diagnostics.Debug.WriteLine("Cancelled");
}
}
在我的代码中,任务在没有启动的情况下被取消。我只在调试控制台上看到“已取消”行。我应该取消任务,因为如果我不这样做,他们的数量和应用程序的 CPU 使用率就会增加。有没有办法做到这一点?
【问题讨论】:
-
为什么你认为
Token在你调用cts.Cancel();之后是有效的 -
那么,你为什么相信这个代码:dotnetfiddle.net/rjGOZn - 会打印错误。
-
我应该声明新的 CancellationTokenSource 吗?
-
是的,你应该这样做。
-
你继续在那里使用那个取消令牌...A Tour of Task, Part 9: Delegate Tasks
标签: c# .net multithreading async-await