限制异步请求而不阻塞

时间:2012-05-18 15:23:16

标签: c# multithreading http asynchronous

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

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

请求方法:

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

在LimitingClass中,它将具有检查给定webservice的最后一个请求的逻辑,如果它违反了限制,那么它将等待一定的时间。但同时,如果另一个请求进入另一个Web服务,那么我不希望在LimitingClass等待时阻止该请求。上述方法有什么根本原因吗?我应该为每个LimitingClass实例打开一个新线程吗?

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

非常感谢

更新:

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

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));
}

我只想将其包装在一个用于检查限制的内容中,并且不会阻止其他请求。

1 个答案:

答案 0 :(得分:1)

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

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