使用没有Task.Wait()的cancellationToken

时间:2012-12-27 20:00:01

标签: c# winforms task cancellation cancellation-token

我有winforms app一个长时间运行的任务和两个按钮。 一键开始和一站。

当我按下开始按钮时,会启动带有取消令牌的新任务。 如果按下“停止”按钮,则会调用取消令牌的取消方法。

我希望UI在所有时间都可用,所以我在哪里放置try,catch块来完成这项工作。在所有的例子中,我看到他们把它放在t.Wait();

但是,如果我这样做,UI会冻结,这就是为什么我首先使用了一个Task,在执行任务时继续使用ui。那么在不使用Task.Wait的情况下放置try catch块的位置。

开始按钮:

 tokenSource2 = new CancellationTokenSource();
   ct = tokenSource2.Token;
   t = new Task(doStart, ct);
   t.Start();

停止按钮:

tokenSource2.Cancel();

1 个答案:

答案 0 :(得分:2)

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

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

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

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