c# - 等待多个异步 POST 请求

标签 c# asynchronous webclient

我需要从 IIS 中托管的 wcf 服务内部进行多个异步调用(可能相关,我不知道)。这些调用是针对其他服务的,但我通过将字符串发布到服务 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); });

我相信以上应该有效;但是,我的问题是我不知道如何等到所有响应都返回。如果我使用计数器并在循环中等待直到它变为零,将没有任何 CPU 可以处理回调。我相信与使用某种形式的信号量相同。有没有一种非阻塞的方式可以等到我收到所有回复? (恐怕将方法签名更改为也采用回调只会将问题向上移动一个级别。)

[编辑] 这是一个非常接近的问题 - How to invoke async operation as sync? - 但我需要等待多个 异步操作。

最佳答案

您为此使用 AutoResetEvent

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

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 包含与 list 一样多的项目时,所有项目都应该完成。当有新项目出现时,您将其添加到 newList。然后,您向 waitEvent 发出信号,表示 newList 发生了“某事”。

在主线程中,您只需等到 newList 中有足够的项,然后通过等待 newList 的更改来等待此操作,waitEvent 通知你。

关于c# - 等待多个异步 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166433/

相关文章:

c# - 在 .NET 中如何使用属性初始化 FormCollection?

c# - 等待 TaskEx.Delay

java - Spring Boot 中 WebClient 中的 POST 请求并以 JSONObject 形式接收响应

c# - 如何在 WPF 中保持可缩放、可滚动内容的纵横比?

c# - 如何从路径中获取文件名?

c# - 将节点添加到 TreeView 会导致 Thread-Exception

javascript - 当收到多个异步获取响应时,您如何选择您想要的响应(即用户请求的响应)?

swift - 为什么图像不在主线程上加载?

c# - 获取随机词

javascript - 从 blob :http using javascript with no redirection 保存文件