3

我有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();
4

1 回答 1

2

您可以更新 doStart 以处理取消事件并优雅地退出任务,因此您根本不需要使用 Wait 例如

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

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

Thread.QueueUserWorkItem((state) =>
{
    try
    {
        t.Wait();
    }
    catch(...)
    {
        ...
    }
});
于 2012-12-27T20:20:20.973 回答