【问题标题】:Lock/Sleep not working锁定/睡眠不起作用
【发布时间】:2017-02-13 16:49:07
【问题描述】:

我编写了一个带锁/睡眠的简单代码,用于向 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);
}

【问题讨论】:

  • 你能贴出你是如何使用使用线程的请求方法的代码吗?
  • “Thread”是较早初始化的变量还是“System.Threading.Thread.CurrentThread”?尝试从 Lock 变量声明中删除“只读”。
  • @Graffito 的 Thread 实例没有 Sleep 方法。
  • @Cologer:即使这不是一个好的做法,您也可以在某处声明:System.Threading.Thread Thread = new System.Threading.Thread()。
  • @Graffito 并创建一个类似Sleep(this Thread t)的扩展方法? ^_^

标签: c# multithreading locking


【解决方案1】:

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

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

这样你的RequestHandler就被实例化了,Lock对象就可以被监控了。否则没有对象可以锁定。我希望这会有所帮助:)

编辑:

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

public WebResponse Request(string url)

【讨论】:

  • 如果您提供评论,请务必对问题和/或答案投反对票,以便 OP 可以学习如何更好地提出问题,而试图提供帮助的人也可以学习。简单地点击向下箭头对任何人都没有帮助。
  • 是的,我同意...无论如何你的答案没有成功,但感谢您的尝试
  • 您的 Main 方法是否也在多个线程中运行?否则我的代码应该可以工作。仔细检查您是否完成了我建议的所有 3 项更改。如果您的 Main 方法也在多个线程(甚至进程)中运行,那么解决这个难题会更加困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2017-07-16
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多