等待多个异步POST请求
我需要从IIS中托管的wcf服务内部进行多个异步调用(可能相关,我不知道)。这些调用是针对其他服务的,但是我通过向服务URL发送一个字符串来创建它们。同步调用它们是可行的,但我有十几个调用,并且它们是完全独立的,所以我想通过异步调用它们来加速它们。等待多个异步POST请求
现在,我意识到我可以简单地使用多线程 - 这可能是最简单的解决方案 - 但我想我会尝试异步。
我的代码是与此类似:
public delegate void Callback(string response);
public static void InvokeAsync(string request, string url, Callback callback)
where TResponse: class
{
var web = new WebClient();
web.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
web.UploadStringCompleted += (sender, e) => callback.Invoke(e.Result);
web.UploadStringAsync(new Uri(url), request);
}
//...
var lockObj = new object();
foreach (var item in list)
InvokeAsync(item, url, response => { lock(lockObj) newList.Add(response); });
以上应该工作,我相信;然而,我的问题是,我不知道如何等待所有的回复。如果我使用计数器并等待一个循环,直到它变为零,则不会有任何CPU处理回调。我相信,同样使用某种形式的信号量。有没有一种非阻塞的方式来等待我收回所有的回应? (改变方法的签名也需要一个回调只会移动问题的一个层面了,我害怕。)
[编辑]这是一个非常接近的问题 - How to invoke async operation as sync? - 但我需要等待多个异步操作。
对此,您使用的是AutoResetEvent
。
尝试为您的最后两行如下所示:在newList
包含尽可能多的项目list
var waitEvent = new AutoResetEvent(false);
foreach (var item in list)
InvokeAsync(item, url, response => { lock(lockObj) newList.Add(response); waitEvent.Set(); });
while (newList.Count < list.Count)
waitEvent.WaitOne();
所有项目应完成。当新项目进来时,您将其添加到newList
。然后,您发信号waitEvent
“newList
”发生了“某事”。
在主线程中,您只需等到newList
中有足够的项目,然后等待更改为newList
,即waitEvent
通知您。
根据HTTP协议,客户端只能打开2个连接到服务。
http://blogs.msdn.com/b/wenlong/archive/2009/02/08/why-only-two-concurrent-requests-for-load-testing.aspx与您一致,但表示一种解决方法那;如果我达到这个限制,我打算使用建议的解决方案。 – 2010-11-12 16:06:37
HTTP协议没有对连接进行总体限制,但确实有2个连接(或代理或网关代码的客户数量的2倍)应该是有原因的;它往往倾向于在许多情况下,每台服务器2台是同时打开的最有效的号码。 .NET强制执行此操作,但它是可配置的。 – 2010-11-12 16:36:13
谢谢!我喜欢这个网站。 – 2010-11-12 16:25:00
不客气。 – 2010-11-12 16:26:54