'Deadlock' только с одним заблокированным объектом?

У меня проблема с многопоточностью в 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 never called
    }
    base.Dispose(disposing);
}

Надеюсь, у кого-нибудь есть идеи, что не так с этим кодом. Заранее спасибо!

6
задан amulware 30 January 2012 в 15:26
поделиться