我在 .NET 4.5 上使用 C# - Web API 自托管。 服务器端我有一个线程不安全的进程:它一次只能处理一个请求。 我如何在 Controller 代码中锁定此资源(进程),以便按顺序为客户端提供服务,等待资源在使用前被释放? 像这样的东西:
while(true){
if(!process.isLocked)
break;
}
lock(process)
do(work)
unlock(process)
warn(others)
感谢任何代码片段或建议。提前致谢。
最佳答案
如果您正在寻找要执行的每个线程,但一次只执行一个线程,那么您可以对静态对象使用 lock
语句:
private static object lockobj = new object();
public void DoWorkWhenNotBusy()
{
lock (lockobj)
{
// do work
Console.WriteLine("Working #1 (should always complete)...");
Thread.Sleep(500);
}
}
如果你想让线程在对象被锁定的情况下立即返回,那么你可以这样写(双重检查锁定):
private static object lockobj2 = new object();
private volatile bool locked = false;
public void DoWorkIfNotBusy()
{
if (!locked)
{
lock (lockobj2)
{
if (!locked)
{
locked = true;
// do work
Thread.Sleep(500);
Console.WriteLine("Working #2 (only if not busy)...");
}
locked = false;
}
}
}
测试示例:
for (int i = 0; i < 10; i++)
{
var ts = new ThreadStart(DoWorkWhenNotBusy);
Thread t = new Thread(ts);
t.Start();
var ts2 = new ThreadStart(DoWorkIfNotBusy);
Thread t2 = new Thread(ts2);
t2.Start();
Console.WriteLine("{0} started", i);
}
关于c# - 共享资源锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503912/