锁定/睡眠不起作用

时间:2017-02-13 16:49:07

标签: c# multithreading locking

我写了一个带锁/睡眠的简单代码,它向API发出请求,我不明白为什么它不起作用。

public class RequestHandler
{
    private static readonly Object Lock = new Object();
    public static WebResponse Request(string url)
    {
        lock(Lock)
        {
            WebRequest request = HttpWebRequest.Create(url);
            WebResponse response = request.GetResponse();
            Thread.Sleep(5000);
            return response;
        }
    }
}

多个线程同时调用此方法。

我按预期得到了每5秒钟一个电话,但有时两个线程同时进入,两个请求间隔不到一秒。

修改:
触发请求的代码(简化)

public void Process(string url)
{
    // do some treatments
    var response = RequestHandler.Request(url);
}

public void Main()
{
    var urls = new List<string>();
    // add urls to the list...
    Parallel.ForEach(urls , Process);
}

1 个答案:

答案 0 :(得分:0)

你的问题在于锁与对象:你不能在一个未实例化的静态类中使用一个锁对象,因为对象需要一个实例才能存在 - 我意识到这就像泥一样清晰,所以我将演示:

// do some treatments
RequestHandler handler = new RequestHandler();
var response = handler.Request(url);

这样就可以实例化RequestHandler,并且可以监视Lock对象。否则没有对象可以锁定。我希望这会有所帮助:)

编辑:

您还必须将Request方法修改为实例:

public WebResponse Request(string url)