等待多个异步POST请求

Mar*_*scu 6 c# asynchronous webclient

我需要从IIS中托管的wcf服务内部进行多次异步调用(可能是相关的,我不知道).这些调用是针对其他服务的,但我通过将字符串POST到服务URL来创建它们.同步调用它们有效,但我有十几个调用,它们完全独立,所以我想通过异步调用它们来加速它们.

现在,我意识到我可以简单地使用多个线程 - 这可能是最简单的解决方案 - 但我想我会尝试异步.

我的代码与此类似:

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); });
Run Code Online (Sandbox Code Playgroud)

我相信上述应该有效; 但是,我的问题是我不知道如何等待所有的回复.如果我使用计数器并在循环中等待它变为零,则不会有任何CPU来处理回调.与使用某种形式的信号量相同,我相信.是否有一种无阻塞的方式等待我收回所有回复?(更改方法签名以进行回调只会将问题提升一级,我担心.)

[编辑]这是一个非常接近的问题 - 如何调用异步操作作为同步?- 但我需要等待多个异步操作.

Pie*_*kel 3

AutoResetEvent为此,您使用 an 。

对最后两行尝试以下操作:

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();
Run Code Online (Sandbox Code Playgroud)

newList当包含的项目数量达到时,所有项目都应完成list。当有新项目出现时,您将其添加到newList. 然后,你向 表示waitEvent“某事”发生了newList

在主线程中,您只需等待,直到有足够的项目newList,然后通过等待 的更改来等待newListwaitEvent通知您。