在旧的 .NET 时代,我们使用 BackgroundWorker 实例来运行异步和长时间运行的操作。
我们可以通过调用 CancelAsync 来取消这些操作,该 CancelAsync 将 CancellationPending 标志设置为 true。
private void BackgroundLongRunningTask(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
for (int i = 1; i <= 10000; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
// Do something
}
}
不再推荐使用异步和长时间运行的操作。但是当时使用的大多数概念都以 Tasks 和 CancellationTokens 的形式发展到现在。
Task 类表示异步操作。vanilla 类不返回值,但泛型版本返回。
您可以直接使用 Task,也可以使用 async await 模式来简化代码。在这篇文章中,我们将使用后者。
示例应用程序固定链接
为了支持这篇文章,我创建了一个代码示例并将其发布在 Github 上。它是一个 .NET Core 2 控制台应用程序,应在任何地方运行。
让我们创建一个简单的长时间运行操作:
/// <summary>
/// Compute a value for a long time.
/// </summary>
/// <returns>The value computed.</returns>
/// <param name="loop">Number of iterations to do.</param>
private static Task<decimal> LongRunningOperation(int loop)
{
// Start a task and return it
return Task.Run(() =>
{
decimal result = 0;