私は連続して作成するスレッドをソース(実際にはデジタルカメラ)から取得し、パネル(パネル)に配置するC# GUIでの画像= IMG)InvalidOperationException - オブジェクトは現在他の場所で使用されています - 赤い十字形
(それはコントロールのコードビハインドであるとして、別のスレッドでなければなりません。アプリケーションは動作しますが、私は(予測不可能なランダムな時間間隔で次のエラーを取得するいくつかのマシン上)
************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.
その後、パネルが赤い十字形に変わり、赤いX - これはプロパティから編集可能な無効な画像アイコンだと思います。イオンは機能し続けますが、パネルは更新されません。
このエラーは、コントロールのオンペイントイベントから来ています。ここで、私は画像に何か他のものを描画します。
私はそこにロックが、運を使用してみました:(
私は次のようにパネル上の画像を置く機能がある呼び出す方法:
if (this.ReceivedFrame != null)
{
Delegate[] clients = this.ReceivedFrame.GetInvocationList();
foreach (Delegate del in clients)
{
try
{
del.DynamicInvoke(new object[] { this,
new StreamEventArgs(frame)});
}
catch { }
}
}
これはデリゲートです:
をpublic delegate void ReceivedFrameEventHandler(object sender, StreamEventArgs e);
public event ReceivedFrameEventHandler ReceivedFrame;
これは、制御コードビハインド内部機能は、それに登録する方法である:
Camera.ReceivedFrame +=
new Camera.ReceivedFrameEventHandler(camera_ReceivedFrame);
は、私はまた、
は、誰もが、私はこのエラーを修正するか、少なくとも何らかの形でエラーをキャッチし、スレッドを作ることができる方法を知ってい
del.Method.Invoke(del.Target, new object[] { this, new StreamEventArgs(b) });
代わりの
del.DynamicInvoke(new object[] { this, new StreamEventArgs(frame) });
が、運を試してみましたもう一度パネルに画像を置く? GDI +のImageクラスはスレッドセーフではありませんので、私はこれが問題 使用ウィンドウの黄金ルールをマルチスレッドとメインスレッドの使用中のパネルを更新していると思う
メインスレッドのパネルを更新していますが、他のスレッドから更新し、パラメータとして画像を渡す関数を呼び出しています。 –
他のスレッドからパネルを更新する関数を呼び出すと、関数自体にコンテキスト切り替えがない場合(たとえば、呼び出しを使用してメインスレッドに切り替えた場合)、メインスレッドではなく他のスレッドで更新が行われたことを意味します。 –