私が作成した1つのスレッドがソースから画像を継続的に取得し(実際にはデジタルカメラです)、GUIのパネル(panel.Image = img)に配置するC#デスクトップアプリケーションがあります(これは別のスレッドである必要があります)コントロールのコード ビハインドです。
アプリケーションは動作しますが、一部のマシンではランダムな時間間隔で次のエラーが発生します (予測不能)
************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.
次に、パネルが赤い十字、赤い X に変わります。これは、プロパティから編集できる無効な画像アイコンだと思います。アプリケーションは引き続き動作しますが、パネルは更新されません。
私が知る限り、このエラーはコントロールの onpaint イベントが原因で、画像に何か他のものを描画します。
私はそこでロックを使用しようとしましたが、運がありません:(
パネルに画像を配置する関数を呼び出す方法は次のとおりです。
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) });
しかし運がない
このエラーを修正する方法、または少なくとも何らかの方法でエラーをキャッチして、スレッドに画像をパネルに再度配置させる方法を知っている人はいますか?