我写了一个带锁/睡眠的简单代码,它向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);
}
答案 0 :(得分:0)
你的问题在于锁与对象:你不能在一个未实例化的静态类中使用一个锁对象,因为对象需要一个实例才能存在 - 我意识到这就像泥一样清晰,所以我将演示:
// do some treatments
RequestHandler handler = new RequestHandler();
var response = handler.Request(url);
这样就可以实例化RequestHandler,并且可以监视Lock对象。否则没有对象可以锁定。我希望这会有所帮助:)
编辑:
您还必须将Request方法修改为实例:
public WebResponse Request(string url)