Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定/睡眠不工作_C#_Multithreading_Locking - Fatal编程技术网

C# 锁定/睡眠不工作

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

我编写了一个带有锁/睡眠的简单代码,用于处理对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秒钟就会接到一个调用,但有时两个线程同时进入,两个请求的执行间隔不到一秒钟

编辑:
激发请求的代码(简化)

公共作废流程(字符串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)