C# 运行单独的线程,更新UI并能够取消它

C# 运行单独的线程,更新UI并能够取消它,c#,multithreading,user-interface,C#,Multithreading,User Interface,我有一个Windows窗体应用程序,它运行的进程最多需要3小时才能完成。当它运行时,我希望UI能够响应“停止”命令,并更新作业进度。简单来说,长时间运行的任务是在一个循环中处理记录数千次,我想在这个循环中更新UI 我已经使用FromCurrentSynchronizationContext选项和TPL任务成功地运行了代码。我还使用CancellationTokens来取消正在运行的线程 然而,我不知道如何将两者结合起来 不确定“将两者结合”是什么意思,但这里有一个非常简单的示例,说明了一个长时间

我有一个Windows窗体应用程序,它运行的进程最多需要3小时才能完成。当它运行时,我希望UI能够响应“停止”命令,并更新作业进度。简单来说,长时间运行的任务是在一个循环中处理记录数千次,我想在这个循环中更新UI

我已经使用FromCurrentSynchronizationContext选项和TPL任务成功地运行了代码。我还使用CancellationTokens来取消正在运行的线程

然而,我不知道如何将两者结合起来

不确定“将两者结合”是什么意思,但这里有一个非常简单的示例,说明了一个长时间运行的任务,该任务支持取消,在每次迭代后更新UI组件

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;

Task.Run(() => 
{
    for(int i = 0; i <= 50; i++)
    {
        Thread.Sleep(300); // simulate work
        // check if the task has been cancelled and throw if required
        if (token.IsCancellationRequested)
            token.ThrowIfCancellationRequested();
        // otherwise update the UI
        someTextBox.Invoke(() => someTextBox.Text = String.Format("Iteration: {0}", i));
    }
}
, token);
// cancel the task after 5 seconds
Task.Run(async delegate 
{
    await Task.Delay(5000); 
    tokenSource.Cancel(); 
});
var tokenSource=new CancellationTokenSource();
var token=tokenSource.token;
Task.Run(()=>
{
对于(inti=0;i someTextBox.Text=String.Format(“迭代:{0}”,i));
}
}
,代币);
//5秒后取消任务
Task.Run(异步委托
{
等待任务。延迟(5000);
tokenSource.Cancel();
});

BackgroundWorker的设计正是基于这一点:该示例看起来几乎就是您想要做的。您能否详细说明“将两者结合”的含义?如果您有取消令牌,只需将其与任务一起传递,并在内部检查状态。请使用BackgroundWorker。看看它的事件和属性,它可以报告进度,您可以使用它来更新UI上的进度。它还支持取消。这是否意味着您有一个windows应用程序启动另一个进程,而第二个进程可以执行此操作?或者一个进程有两个线程?使用
BackgroundWorker
Runasync
然后
Invoke
BackgroundWorker
中更改UI。要取消它,只需在itTask.Run上使用
Cancelasync
。我相信是.Net 4.5,在.Net 4.0中它的等价物是什么。@user3324178 Task.Factory.StartNew