小编tra*_*kos的帖子

锁定线程的正确方法是什么?

在我的 MVC 3 C# 应用程序中,我有一些静态对象,我希望一次可用于一个请求。只能通过方法访问它,但我希望在调用其方法之间保持锁定。

调用仅在控制器中完成,通常会有一两个锁定的代码块。

起初我想公开一些静态公共对象并像这样使用它

lock(MyClass.lockObject)
{
 MyClass.doStuff();
 MyClass.doStuff2();
}
Run Code Online (Sandbox Code Playgroud)

,但我发现它很容易出错,因为我可能会忘记将其锁定在某个地方。Monitor.Enter()我想知道在构造函数和Dispose 方法中使用它是否是正确的方法Monitor.Exit(),然后将我的方法更改为非静态?比如说:

public class MyClass:IDisposable
{
    static protected object _locker = new object();
    protected bool isDisposed = false;

    public MyClass()
    {
        Monitor.Enter(_locker);
    }

    public void Dispose()
    {
        if (!isDisposed)
        {
            Monitor.Exit(_locker);
            GC.SuppressFinalize(this);
            isDisposed = true;
        }
    }

    ~SPInstances()
    {
        Dispose();
    }

    public void doStuff()
    {
        if(isDisposed) throw new ObjectDisposedException();
        // do stuff here, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以将它用作:

using(MyClass myinstance = new MyClass())
{
    myInstance.doStuff(); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc multithreading asp.net-mvc-3

5
推荐指数
1
解决办法
2128
查看次数

标签 统计

asp.net-mvc ×1

asp.net-mvc-3 ×1

c# ×1

multithreading ×1