gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:57 25 4
gpt4 key购买 nike

我一直在做很多关于这个主题的研究,但有很多东西需要吸收,我不确定什么最适合我的情况。

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

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

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

最后我想知道在后台线程中等待异步方法是否有意义,或者它是否无缘无故地使代码更复杂?如果没有意义,使用异步代码比仅在后台线程中完成工作有什么好处?

最佳答案

Async/Await 不同于线程。 100-1000 个线程是一个很多,尤其是对于仅执行 I/O 的情况。

如果在后台线程中使用 Async,它可以减少必要的线程数。但是,根据您当前的描述,我同意其他评论者的观点,即听起来根本 不需要后台线程。

Async/Await 旨在遵循与常规代码相同的流程,因此如果您的代码使用 try/catch 来重试失败,那么您的 async 代码将使用相同的 try/catch

要执行序列化工作(“按顺序”),只需等待返回的任务:

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 intro有帮助。

关于c# - 我应该在后台线程中使用异步方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25764970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com