【发布时间】:2017-05-24 21:56:29
【问题描述】:
我有一个静态类,它有一个静态函数 IsDataCorrect(),它执行 http 请求。
该函数可以同时从多个线程调用,我想让第一个线程做请求,其他的应该被拒绝(意味着他们应该得到 false 作为返回值,他们不应该只是被阻塞!) 直到第一个线程完成请求后半秒。
之后,下一个获胜的线程应该可以做下一个请求,其他的应该被拒绝,以此类推。
这是我的方法,请有人确认这是否合理:
static class MyClass
{
private static bool IsBusy = false;
private static object lockObject = new object();
public static bool IsDataCorrect(string testString)
{
lock (lockObject)
{
if (IsBusy) return false;
IsBusy = true;
}
var uri = $"https://something.com";
bool htmlCheck = GetDocFromUri(uri, 2);
var t = new Thread(WaitBeforeFree);
t.Start();
//Fast Evaluations
//...
return htmlCheck;
}
private static void WaitBeforeFree()
{
Thread.Sleep(500);
IsBusy = false;
}
}
【问题讨论】:
-
你为什么不在
WaitBeforeFree()中使用锁定?我还将volatile关键字添加到IsBusy成员。 -
这个想法是只有获胜的线程才能到达那个部分,所以对我来说似乎没有必要这样做。
-
但是您正在获取/设置
IsBusy在启动IsDataCorrect()中获胜线程的线程中,因此您有2 个线程获取/设置它。 -
您不应该在多个线程上执行任何。从服务器获取文档是 I/O 绑定的。延迟操作不需要整个线程!你不会雇一个工人为你睡觉!所有这些工作流程都可以通过单线程异步完成。
-
感谢您的所有 cmets!我采用了 LB2 下面的解决方案,它应该涵盖我希望的所有反对意见!
标签: c# multithreading locking