У меня проблема с многопоточностью в 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);
}
Надеюсь, у кого-нибудь есть идеи, что не так с этим кодом. Заранее спасибо!