我有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();
答案 0 :(得分:2)
您可以更新doStart来处理取消事件并优雅地退出任务,这样您就不需要使用Wait了。
public void doStart(CancellationToken token)
{
while(...)
{
...
if (token.IsCancellationRequested)
break;
}
}
或者,您可以在另一个线程上等待任务结果,例如
Thread.QueueUserWorkItem((state) =>
{
try
{
t.Wait();
}
catch(...)
{
...
}
});