【问题标题】:Call WebMethod asynchronously using semaphore and timeout in C#在 C# 中使用信号量和超时异步调用 WebMethod
【发布时间】: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 是关于控制线程访问的。我认为您不想这样做……可能是错误的,但不确定。 AsynchronouslySimultaneously 是两个不同的东西。默认情况下,“Web 方法”在各自的线程上执行,由线程池分配。所以更好的问题是,你为什么要限制你的 web 服务一次只能处理 10 个请求,相对于……机器可以处理它们的速度(100 秒)。我这样做的原因是我认为您的理解可能不正确。
  • @Seabizkit,我一次只需要 10 个请求而不是 100 个,因为如果我一起执行所有 100 个请求,服务器将无响应。因此,通过同时向服务器请求 10 个请求,它可能会更快地给出响应。为此,我想使用SemaphoreSlim 控制 10 个线程,一旦线程有空执行其他任务,我将向线程提供新请求。因此,我将始终有 10 个线程运行 Asynchronously。此外,在 10 个线程中,如果任何线程/请求花费的时间超过指定时间(即 5000 毫秒),我想给超时,释放 SemaphoreSlim 并将线程分配给新请求。

标签: c# asp.net semaphore webmethod


【解决方案1】:

可能是中间件帮助你。例如:

public class SemaphoreMiddleware
{
    private readonly static SemaphoreSlim semaphore = new SemaphoreSlim(10, 10);

    private readonly RequestDelegate nextMiddleware;

    public SemaphoreMiddleware(RequestDelegate nextMiddleware)
    {
        this.nextMiddleware = nextMiddleware;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        await semaphoreSlim.WaitAsync(stoppingToken);
        try
        {
            await nextMiddleware(httpContext);
        }
        finally
        {
            semaphore.Release();
        }
    }
}

ASP.NET Core 中间件https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1

【讨论】:

  • 我猜,中间件是以同步方式运行的东西,我们应该使用它,当A依赖B,B依赖C,C依赖D等等...... A >> B >> C >> D,然后如果我们想执行 D >> C >> B >> A 来获取响应。但就我而言,我想要一些异步运行的东西,我们可以通过设置响应超时来控制多个线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多