等待多个异步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。然后,您发信号waitEventnewList”发生了“某事”。

在主线程中,您只需等到newList中有足够的项目,然后等待更改为newList,即waitEvent通知您。

+0

谢谢!我喜欢这个网站。 – 2010-11-12 16:25:00

+0

不客气。 – 2010-11-12 16:26:54

根据HTTP协议,客户端只能打开2个连接到服务。

+0

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

+0

HTTP协议没有对连接进行总体限制,但确实有2个连接(或代理或网关代码的客户数量的2倍)应该是有原因的;它往往倾向于在许多情况下,每台服务器2台是同时打开的最有效的号码。 .NET强制执行此操作,但它是可配置的。 – 2010-11-12 16:36:13