【发布时间】:2021-02-11 15:05:00
【问题描述】:
我是基于 Web 的 C# 编程和异步 WebMethod 调用的新手。我已经阅读了几篇文章,但没有找到任何有效的方法。
如果我有 100 个 Web 服务方法调用并且我想同时异步调用其中的 10 个方法,该怎么办。等待每个 WebMethod 响应 5000 毫秒,如果响应未在 5000 毫秒内到达,则提供超时,并根据这 10 次调用的信号量释放,我将从 WebMethod 的其余部分调用新方法。
实现这种场景的最佳方法是什么?
示例: 我只展示了 1 个示例方法,但这样我必须异步调用 100 多个方法。
SemaphoreSlim Semaphore = new SemaphoreSlim(0,10);
//Register method
soapClient.MethodNameCompleted += soapClient_MethodNameCompleted;
//Call method async
MethodNameAsync();
Semaphore.Wait()
//This method calls only when WebMethod send a response
void soapClient_MethodNameCompleted(object sender, MethodNameCompletedEventArgs e)
{
string result = e.Result.ToString();
Semaphore.Release();
}
【问题讨论】:
-
mmm,
SemaphoreSlim是关于控制线程访问的。我认为您不想这样做……可能是错误的,但不确定。Asynchronously和Simultaneously是两个不同的东西。默认情况下,“Web 方法”在各自的线程上执行,由线程池分配。所以更好的问题是,你为什么要限制你的 web 服务一次只能处理 10 个请求,相对于……机器可以处理它们的速度(100 秒)。我这样做的原因是我认为您的理解可能不正确。 -
@Seabizkit,我一次只需要 10 个请求而不是 100 个,因为如果我一起执行所有 100 个请求,服务器将无响应。因此,通过同时向服务器请求 10 个请求,它可能会更快地给出响应。为此,我想使用
SemaphoreSlim控制 10 个线程,一旦线程有空执行其他任务,我将向线程提供新请求。因此,我将始终有 10 个线程运行Asynchronously。此外,在 10 个线程中,如果任何线程/请求花费的时间超过指定时间(即 5000 毫秒),我想给超时,释放SemaphoreSlim并将线程分配给新请求。
标签: c# asp.net semaphore webmethod