- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在做很多关于这个主题的研究,但有很多东西需要吸收,我不确定什么最适合我的情况。
我正在制作运行多个“任务”(不是 .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/
我是一名优秀的程序员,十分优秀!