【发布时间】:2014-09-12 11:34:20
【问题描述】:
我正在尝试使用服务引用,使用任务调度程序同时发出多个请求。该服务包括一个返回结果集的同步和异步函数。我有点困惑,我有几个初步的问题,然后我将分享我在每个问题上的进展情况。我正在使用一些日志记录、并发可视化工具和提琴手进行调查。最终,我想使用反应式调度程序来发出尽可能多的请求。
1) 我应该使用异步函数来发出所有请求吗?
2) 如果我要在多个任务中使用同步功能,那么可能会导致我的线程数不足的有限资源是什么?
这是我目前所拥有的:
var myScheduler = new myScheduler();
var myFactory = new Factory(myScheduler);
var myClientProxy = new ClientProxy();
var tasks = new List<Task<Response>>();
foreach( var request in Requests )
{
var localrequest = request;
tasks.Add( myFactory.StartNew( () =>
{
// log stuff
return client.GetResponsesAsync( localTransaction.Request );
// log some more stuff
}).Unwrap() );
}
Task.WaitAll( tasks.ToArray() );
// process all the requests after they are done
这会运行,但根据提琴手的说法,它只是尝试一次完成所有请求。它可能是调度程序,但我相信比我做上述更多。
我也尝试在没有 unwrap 命令的情况下实现它,而是使用异步等待委托,它做同样的事情。我也尝试过引用 .result ,这似乎是按顺序进行的。使用调度程序/工厂的非同步服务函数调用,每个客户端最多只能同时获得大约 20 个同时请求。
【问题讨论】:
-
您希望它做什么而不是一次触发所有请求?
-
@i3arnon - 感谢您的回复!我有数以万计的请求要提出。该服务只能根据当前负载处理这么多。我不是唯一的客户。我想使用自定义调度器根据服务响应时间调整并发请求数。
-
最好使用信号量来完成。见my answer
标签: c# wcf asynchronous task-parallel-library async-await