C# 异步编程中的 Await 与 ContinueWith

科技   2024-11-04 06:11   上海  


在 C# 中,异步编程用于提高应用程序的响应能力,它允许在后台执行长时间运行的操作,同时释放 UI 线程用于其他任务。异步编程中使用的两个重要关键字是 和 。在本文中,我们将探讨这两个关键词之间的区别以及何时使用它们。awaitContinueWith

await 关键字

该关键字用于暂停异步方法的执行,直到等待的任务完成。这允许调用方法在等待任务完成时保持响应。关键字只能在标有修饰符的方法中使用,并且这些方法返回 或 。awaitawaitasyncTaskTask<TResult>

例:

public async Task<int> CalculateSumAsync(int a, int b)  
{
int result = await Task.Run(() => Add(a, b));
return result;
}

在上面的示例中, 用于等待方法完成,然后再返回加法操作的结果。awaitTask.Run()

ContinueWith 关键字

该方法用于定义任务完成后应发生的情况,即任务是成功、失败还是被取消。它链接其他任务,以便在初始任务完成时执行,而不管其结果如何。与 不同,不会暂停执行;相反,它会计划在任务完成后执行的延续。ContinueWithawaitContinueWith

例:

public async Task<int> CalculateSumAsync(int a, int b)  
{
return await Task.Run(() => Add(a, b)).ContinueWith(task => {
Console.WriteLine("Task completed.");
});
}

在此示例中,在方法完成后,打印一条指示任务完成的消息。在这里,任务完成后,延续将异步运行,从而允许链接进一步的操作。Task.Run()ContinueWith

await 和 ContinueWith 关键字之间的区别

阻塞行为:

  • await阻止进一步执行,直到等待的任务完成。此暂停在异步方法中自动发生。

  • ContinueWith不会阻塞 Calling 方法。它计划延续并立即返回,而延续在任务完成后运行。

错误处理:

  • 使用 ,异步操作中的异常会自动在调用方法中重新引发,从而使错误处理更加直观。await

  • ContinueWith需要手动处理异常 using in case of errors.如果您忘记处理异常,它们可能会被忽视。task.Exception

链接任务:

  • await通常用于在继续之前按顺序处理异步操作的结果。

  • ContinueWith当您需要链接其他任务(如日志记录或后处理)而不关心立即结果时,它非常有用。

返回值:

  • await直接返回异步任务的结果,以便进行进一步处理。

  • ContinueWith不会以直接方式返回结果,除非通过 或其他方式明确处理。task.Result

何时使用 await 关键字

在继续该方法之前需要异步操作的结果时使用。它非常适合以下代码行取决于任务结果的方案。例如:await

  • 根据后台操作的完成情况更新 UI 时。

  • 当执行数据库操作并需要结果进行进一步计算时。

何时使用 ContinueWith 关键字

当您想要计划应在异步操作完成后执行的其他任务(无论其结果如何)时使用。它在以下情况下是有益的:ContinueWith

  • 运行清理逻辑,例如在任务后处置资源。

  • 记录任务完成或失败,而不影响主任务流。

  • 执行后台任务的非阻塞链接。

总之,两者在 C# 异步编程中都起着至关重要的作用。当您需要暂停执行并等待任务完成时,通常会使用该关键字,从而实现响应式和高效的代码流。,则对于在不阻止调用方法的情况下将其他操作链接到任务非常有用。了解何时使用每种方法是编写干净、非阻塞和响应式异步代码的关键。

如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章