C# 锁定/睡眠不工作
我编写了一个带有锁/睡眠的简单代码,用于处理对API的请求,我不明白为什么它不起作用C# 锁定/睡眠不工作,c#,multithreading,locking,C#,Multithreading,Locking,我编写了一个带有锁/睡眠的简单代码,用于处理对API的请求,我不明白为什么它不起作用 public class RequestHandler { private static readonly Object Lock = new Object(); public static WebResponse Request(string url) { lock(Lock) { WebRequest request = Htt
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秒钟就会接到一个调用,但有时两个线程同时进入,两个请求的执行间隔不到一秒钟
编辑:激发请求的代码(简化)
公共作废流程(字符串url)
{
//做一些治疗
var response=RequestHandler.Request(url);
}
公共图书馆
{
var url=新列表();
//将URL添加到列表。。。
Parallel.ForEach(URL、进程);
}
您的问题在于锁与对象:您不能在未实例化的静态类中使用锁对象,因为该对象需要一个实例才能存在-我意识到这一点非常清楚,因此我将演示:
// do some treatments
RequestHandler handler = new RequestHandler();
var response = handler.Request(url);
这样就可以实例化RequestHandler,并监视锁对象。否则就没有要锁定的对象。我希望这有帮助:)
编辑:
您还必须将请求方法修改为实例:
public WebResponse Request(string url)
您可以发布代码,说明您是如何使用线程的请求方法的吗?是“Thread”是较早初始化的变量还是“System.Threading.Thread.CurrentThread”?尝试从锁变量声明中删除“readonly”。@线程的Graffito实例没有
Sleep
方法。@科洛格:即使这不是一个好的做法,您也可以在某处声明:System.Threading.Thread Thread=new System.Threading.Thread()。@Graffito并创建一个扩展方法,如Sleep(this Thread t)
^_^如果您提供评论,请务必对问题和/或答案进行否决投票,以便OP可以学习如何更好地提问,并且尝试帮助的人也可以学习。简单地点击下箭头对任何人都没有帮助。是的,我同意。。。不管怎么说,你的答案没有得到解决,但是谢谢你的尝试。你的主要方法是否也在多个线程中运行?否则我的代码应该可以工作。再次检查您是否完成了我建议的所有3项更改。如果您的主方法也在多个线程(甚至进程)中运行,那么这将是一个更难解决的难题。
public WebResponse Request(string url)