c# - 共享资源锁

标签 c# asp.net thread-safety asp.net-web-api

我在 .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/

相关文章:

在我的 ASP.Net 应用程序中找不到 Javascript

c# - 在整个 session 中维护数据表和变量

javascript - asp.net 中的 HTML 标记注入(inject)

java - 在不同步的情况下共享数据 - 这段代码线程安全吗?

c++ - C++ 中的大小函数和线程安全

c# - 存储一个短字符串

javascript - 传递参数日期时间?在 mvc 和 jquery 中

c# - 如何处理 ASP.NET MVC5 应用程序中的请求超时?

c++ - 单例线程安全类

c# - ASP.NET session 状态、序列化和继承