相关疑难解决方法(0)

'死锁'只有一个被锁定的物体?

我在C#中遇到多线程问题.我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用Invoke()命令.那部分也很好.但是,用户可以关闭表单,如果在不幸的时间发送事件,程序可能会崩溃.

所以,我想我会简单地覆盖窗体的Dispose()方法,在锁定代码中将布尔值设置为true,并检查布尔值并在锁定代码中调用事件.

但是,每次关闭表单时程序都会完全冻结.

以下是代码中提到的部分:

private object dispose_lock = new object();
private bool _disposed = false;

private void update(object sender, EventArgs e)
{
    if (InvokeRequired)
    {
        EventHandler handler = new EventHandler(update);
        lock (dispose_lock)
        {
            if (_disposed) return;
            Invoke(handler); // this is where it crashes without using the lock
        }
        return;
    }

    label.Text = "blah";
}

protected override void Dispose(bool disposing)
{
    eventfullObject.OnUpdate -= update;
    lock (dispose_lock) // this is where it seems to freeze
    {
       _disposed = true; // this is …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading locking winforms

6
推荐指数
2
解决办法
1839
查看次数

这种嵌套锁定会导致死锁吗?

Method1和Method2是公共方法.这两种方法都需要以相同的顺序接受两个锁.我确定以相同的顺序获取锁定不会导致死锁.锁是Common()不必要的?

public void Method1()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething
        Common();
    }
}

public void Method2()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething else
        Common();
    }
}

private void Common()
{
    lock(LockObjA)
    lock(LockObjB)
    {
        //DoSomething else
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading locking

2
推荐指数
1
解决办法
429
查看次数

标签 统计

.net ×2

c# ×2

locking ×2

multithreading ×2

winforms ×1