使用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();

使用cancellationToken而不使用Task.Wait()

你可以更新doStart来处理取消事件并优雅地退出任务,这样你就不需要使用Wait了,例如

public void doStart(CancellationToken token)
{
    while(...)
    {
        ...
        if (token.IsCancellationRequested)
            break;
    }
}

或者,您可以在另一个线程上等待任务结果,例如

Thread.QueueUserWorkItem((state) =>
{
    try
    {
        t.Wait();
    }
    catch(...)
    {
        ...
    }
});