首页 >后端开发 >C++ >异步/等待:我应该将我的方法包装在'Task.Run”中以进行后台线程吗?

异步/等待:我应该将我的方法包装在'Task.Run”中以进行后台线程吗?

Patricia Arquette
Patricia Arquette原创
2025-01-05 12:31:40171浏览

Async/Await: Should I Wrap My Method in `Task.Run` for Background Threading?

解开 Async/Await:方法包装器还是后台线程?

在理解 async/await 的过程中,出现了一个困境:是否有必要在其中封装一个方法Task.Run 同时实现异步行为和后台线程执行?

异步方法与可等待方法任务

“异步”表示可以在开始执行之前将控制权交给调用线程的方法。这种让步是通过await 表达式发生的。相反,MSDN(一个经常误导性的术语)定义的“异步”是指在单独线程上运行的代码。

另外,“awaitable”描述了可以与await 运算符一起使用的类型。常见的可等待对象包括 Task 和 Task

为后台线程执行定制代码

要在保持可等待性的同时在后台线程上执行方法,请使用 Task.Run:

private Task<int> DoWorkAsync()
{
  return Task.Run(() => 1 + 2);
}

但是,通常不鼓励这种方法。

启用异步屈服

要创建可以暂停和屈服控制的异步方法,请将该方法声明为异步,并在指定的屈服点使用await:

private async Task<int> GetWebPageHtmlSizeAsync()
{
  var html = await client.GetAsync("http://www.example.com/");
  return html.Length;
}

链接异步代码和Awaitables

异步代码依赖于其await表达式中的awaitables。 Awaitable 可以是其他异步方法,也可以是返回可等待的同步方法。

在 Task.Run 中包装方法:不鼓励的做法

避免在 Task.Run 中不加区别地包装同步方法。相反,维护同步签名,将包装选项留给消费者。

异步/等待的其他资源

  • [Async/Await 基础知识](https://blog.stephencleary .com/2012/02/async-await-fundamentals.html)
  • [MSDN异步文档](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/)

以上是异步/等待:我应该将我的方法包装在'Task.Run”中以进行后台线程吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn