C# 在不阻塞的情况下限制异步请求

C# 在不阻塞的情况下限制异步请求,c#,multithreading,http,asynchronous,C#,Multithreading,Http,Asynchronous,我想了解一些关于在使用多个web服务时限制http请求的建议/策略。我觉得如果请求是同步发生的,我可以这样做,但它们是异步的,我认为我应该尝试以一种我不会阻止的方式执行限制逻辑 由于web应用程序使用多个web服务,因此对于不同的请求将有不同的限制。我在想这样的事情,但不确定如何以无阻塞的方式进行: 请求方法: public static Task<string> AsyncRequest(string url, enum webService) { using(Limiti

我想了解一些关于在使用多个web服务时限制http请求的建议/策略。我觉得如果请求是同步发生的,我可以这样做,但它们是异步的,我认为我应该尝试以一种我不会阻止的方式执行限制逻辑

由于web应用程序使用多个web服务,因此对于不同的请求将有不同的限制。我在想这样的事情,但不确定如何以无阻塞的方式进行:

请求方法:

public static Task<string> AsyncRequest(string url, enum webService)
{
    using(LimitingClass limiter = new LimitingClass(webService))
    {
       //Perform async request
    }
}        
public static Task<string> MakeAsyncRequest(string url, string contentType)
{
    HttpWebRequest request = //set up my request

    Task<WebResponse> task = Task.Factory.FromAsync(
        request.BeginGetResponse,
        asyncResult => request.EndGetResponse(asyncResult),
        (object)null);

    return task.ContinueWith(t => ReadCallback(t.Result));
}
公共静态任务异步请求(字符串url,枚举Web服务)
{
使用(LimitingClass Limitor=新的LimitingClass(webService))
{
//执行异步请求
}
}        
在LimitingClass中,它的逻辑类似于检查给定Web服务的最后一个请求,如果它违反了限制,那么它将等待一定的时间。但同时,如果另一个请求进入另一个Web服务,那么我不希望在LimitingClass等待时阻止该请求。上述方法有什么根本性的错误吗?我应该为每个LimitingClass实例打开一个新线程吗

如果可能的话,一些伪代码会很好

非常感谢

更新:

这是我当前请求方法的简化版本:

public static Task<string> AsyncRequest(string url, enum webService)
{
    using(LimitingClass limiter = new LimitingClass(webService))
    {
       //Perform async request
    }
}        
public static Task<string> MakeAsyncRequest(string url, string contentType)
{
    HttpWebRequest request = //set up my request

    Task<WebResponse> task = Task.Factory.FromAsync(
        request.BeginGetResponse,
        asyncResult => request.EndGetResponse(asyncResult),
        (object)null);

    return task.ContinueWith(t => ReadCallback(t.Result));
}
公共静态任务MakeAsyncRequest(字符串url、字符串contentType)
{
HttpWebRequest请求=//设置我的请求
Task Task=Task.Factory.fromsync(
request.BeginGetResponse,
asyncResult=>request.EndGetResponse(asyncResult),
(对象为空);
返回task.ContinueWith(t=>ReadCallback(t.Result));
}

我只想将其包装在一个using中,以检查限制,并且它不会阻止其他请求。

那么,如何在不阻止的情况下限制对资源的访问


我认为您需要了解-它们允许限制可以同时访问资源或资源池的线程数。

那么如何在不阻塞的情况下限制对资源的访问



我认为您需要考虑-它们允许限制可以同时访问资源或资源池的线程数。

听起来您希望每个web服务都有一个信号量。或者,您可以简单地缓存响应以等待一段时间,然后,只有在缓存过期后才重新请求服务资源。我会缓存常见的请求,但其他请求不会缓存,因为它们太独特/罕见。那么,您的代码如何运行?这听起来像是在多线程场景中,或者只有一个线程请求过资源?@Tejs用我的请求方法更新听起来像是每个web服务都需要一个信号量。或者,您可以简单地缓存响应以等待一段时间,然后,只有在缓存过期后才重新请求服务资源。我会缓存常见的请求,但其他请求不会缓存,因为它们太独特/罕见。那么,您的代码如何运行?不管怎么说,这听起来像是在一个多线程的场景中,或者只有一个线程请求过资源?@Tejs用我的请求方法更新了。你能详细介绍一下信号量的使用吗?嗯,这就是我上面说的。您可以允许5个线程访问您的资源;6th将不必等待前5项中的一项完成。它仍然是一个阻塞解决方案,但它不限制对1个线程的访问。顺便说一句,您正在访问一个web服务,为什么要限制对它的同步请求数?听起来不对。我没有限制同步请求的数量,我只是遵守web服务规则,即每秒最多2次调用等,同时允许其他请求同时发生。好的。。那么,为什么不在该web服务周围创建一个静态包装器,它将检查从上次请求开始的时间呢?如果这一秒已经有2个请求-返回一些消息。有趣的是,你将如何计算速率请求计数器,它将每秒重置一次,或者请求之间的间隔为0.5秒?限制类将是web服务的包装器,用于计算每个web服务的限制,但我的问题是,如果限制类正在等待,我如何允许其他对不同web服务的请求通过?您可以详细说明如何使用信号量吗?嗯,这就是我上面所说的。您可以允许5个线程访问您的资源;6th将不必等待前5项中的一项完成。它仍然是一个阻塞解决方案,但它不限制对1个线程的访问。顺便说一句,您正在访问一个web服务,为什么要限制对它的同步请求数?听起来不对。我没有限制同步请求的数量,我只是遵守web服务规则,即每秒最多2次调用等,同时允许其他请求同时发生。好的。。那么,为什么不在该web服务周围创建一个静态包装器,它将检查从上次请求开始的时间呢?如果这一秒已经有2个请求-返回一些消息。有趣的是,你将如何计算速率请求计数器,它将每秒重置一次,或者请求之间的间隔为0.5秒?限制类将是web服务的包装器,用于计算每个web服务的限制,但我的问题是,如果限制类正在等待,我如何允许其他对不同web服务的请求通过?