我应该在后台线程中使用异步方法吗

本文关键字:异步方法 后台 线程 我应该 | 更新日期: 2023-09-27 18:21:25

我对这个话题做了很多研究,但有很多东西需要学习,我不确定什么最适合我的情况。

我正在制作运行多个"任务"的.NET应用程序(不是.NET意义上的任务,只是我使用的词)。每个任务都需要连续执行一些操作,直到被取消为止。通常涉及套接字连接或HttpWebRequest。

当前设置如下:;当一个任务启动时,它会创建多个线程,通常是100-1000个线程。这些线程都运行同一个子例程,该子例程包含一个循环,其中包含与该应用程序相关的操作。

由于我同时运行大量的HttpWebRequest/Socket连接,我希望尽可能地平衡所有CPU核心的负载。目前,我使用HttpWebRequest的同步GetResponse方法。由于这种情况发生在后台线程中,我不在乎线程被阻塞,因为我无论如何都需要HttpWebResponse来继续线程操作。如果我使用Await GetResponseAsync方法,这会让操作系统更好地平衡负载吗?

最终,我想知道在后台线程中等待异步方法是否有意义,或者它会无缘无故地使代码变得更复杂?如果没有意义,那么使用异步代码比只在后台线程中执行任务有什么好处?

我应该在后台线程中使用异步方法吗

Async/Await不同于线程。100-1000个线程是的一部分,尤其是对于只做I/O的线程。

如果在后台线程中使用异步,则可以减少所需的线程数。然而,从你目前的描述来看,我同意其他评论者的观点,即听起来根本不需要任何背景线程。

Async/Await被设计为遵循与常规代码相同的流程,因此如果您的代码使用try/catch在失败时重试,那么您的async代码将使用相同的try/catch等。

要进行序列化工作("按顺序"),只需await返回的任务:

await client.GetAsync(..);
await client.PostAsync(..); // doesn't post until the get completes
await client.GetAsync(..); // doesn't get until the post completes

要进行并发工作,请收集任务,然后将它们传递给Task.WhenAll:

List<Task> tasks = new List<Task>();
for (int i = 0; i != 1000; ++i)
{
  Task task = DoMyOperationAsync();
  tasks.Add(task);
}
await Task.WhenAll(tasks);

你可能会发现我的async简介很有帮助。