C#でマルチスレッドに問題があります。 イベントを使用して、別のスレッドからフォームのラベルを更新します。そのためには、もちろんInvoke()コマンドを使用する必要があります。 その部分もうまくいきます。 しかし、ユーザーはフォームを閉じることができます。イベントが残念ながら送信された場合、プログラムはクラッシュする可能性があります。ロックされたオブジェクトが1つのみの「デッドロック」ですか?
フォームの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);
}
私はここに誰もがこのコードで何が間違っている任意のアイデアを持っている願っています。 ありがとうございます!
実際のアプリケーションで更新呼び出しがウィンドウが廃棄させてもらえますか?その場合、バックグラウンドスレッドはロックを持つ可能性があり、UIスレッドは、バックグラウンドスレッドが保持しているのと同じオブジェクトに対してDisposeロックに終わる可能性があります。 –
どこから変数InvokeRequiredを取得しているのですか?更新するコントロールで呼び出す必要があります:if(label.InvokeRequired){//} – Lloyd