multithreading - 异步调用的任务限制?

标签 multithreading wcf task

我有一个同步工作的 .NET 4.5 WCF 客户端。我正在更新它以使用新的异步/等待功能来同时进行多个服务器调用以同时获取数据 block 。

在结束之前,我担心同时运行的所有线程会使服务器饱和(更不用说明年升级到 Azure 辅助角色时取消我的 Azure 辅助角色)。有没有办法集中管理我在类级别使用的任务线程总数?该代码与其他 WCF 客户端代码共享一个程序集。

感谢所有想法。

最佳答案

从字面上回答您的问题:您可以通过实现自己的 TaskScheduler 来控制用于处理任务的线程数并将其分配给您创建的每个任务。微软甚至有一个 fully working example .

不过,要回答根本问题:Task 并不意味着 Thread。事实上,async/await 的主要目标是减少您应用中的线程数。实际上,可以围绕 async/await 和 Tasks 设计一个完整的应用程序,同时运行数千个并发任务,它只使用一个单个线程。

您希望您的代码在尽可能少的线程中运行,最好不超过您拥有的逻辑 CPU 的数量,并且您希望 I/O 与您的代码同时发生。操作系统可以为您管理所有 I/O,而无需创建额外的线程。任务可帮助您完成此任务。

它唯一可以为每个任务创建一个线程的情况是您正在模拟异步性,例如。调用 Task.Run 来运行阻塞代码。这种代码确实不明智:

Task t1 = Task.Run(()=>DownloadFile(url1));
Task t2 = Task.Run(()=>DownloadFile(url2));

await Task.WhenAll(t1, t2)

真正的异步代码(可以在单个线程中运行)要好得多,例如:

Task t1 = DownloadFileAsync(url1);
Task t2 = DownloadFileAsync(url2);

await Task.WhenAll(t1, t2)

或者,对于任意数量的任务:

List<Task> tasks = new List<Task>();

foreach(string url in urls)
{
    tasks.Add(DownloadFileAsync(url))
}

await Task.WhenAll(tasks);

关于multithreading - 异步调用的任务限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574377/

相关文章:

wcf - 404 BadRequest使用IIS主机 header 通过外部IP公开WCF服务

c# - 如何使用 WCF 在 WSSE 安全 header 中设置密码类型 "PasswordText"

wcf - 无法让 Azure WCF 服务与客户端证书一起使用

sharepoint - 来自 SPWeb 的计时器作业

c# - 完成的任务没有继续进行

c# - 如何在C#中列出计划任务

c++ - 向调用线程发出信号,表明资源已在使用中

c# - 调用 Task.Result 时出现 ThreadAbortException

java - 在google appengine后端仅运行一个后台线程

c - 当来自另一个线程的消息时,Winapi 控件不适本地访问内存