使用cancellationToken而不使用Task.Wait()
本文关键字:Task Wait cancellationToken 使用 | 更新日期: 2023-09-27 17:49:45
我有一个winforms app
长时间运行的任务和两个按钮。一键启动一键停止
当我按下开始按钮时,一个带有取消令牌的新任务开始。如果我按下停止按钮取消令牌的取消方法被调用。
我希望UI在所有的时间都是可用的,所以我在哪里把这个工作的try, catch块。在所有的例子中,我看到他们把它放在t的周围。
但是如果我这样做,UI就会冻结,这就是为什么我首先使用Task的原因,在执行任务时继续使用UI。那么,在没有使用Task.Wait的情况下,把try catch块放在哪里呢?
Start按钮:
tokenSource2 = new CancellationTokenSource();
ct = tokenSource2.Token;
t = new Task(doStart, ct);
t.Start();
停止按钮:
tokenSource2.Cancel();
你可以更新doStart来处理取消事件并优雅地退出任务,这样你就不需要使用Wait了,例如
public void doStart(CancellationToken token)
{
while(...)
{
...
if (token.IsCancellationRequested)
break;
}
}
或者,您可以在另一个线程上等待任务结果,例如
Thread.QueueUserWorkItem((state) =>
{
try
{
t.Wait();
}
catch(...)
{
...
}
});