0

複数のスレッドを使用する必要があるアプリケーションを作成しています。これらのスレッドのそれぞれがタスクを実行し、そのタスクの最後に進行状況バーを更新して全体の進行状況を示します。問題は、クラッシュする可能性のあるこれらのスレッドを制御できないため、予防策としてロックを使用しましたが、次のコードまたはそのバリエーションを使用するように勧められたことです。このコードをどこに配置すべきかについて、ご意見をお聞かせください。

var temp = updateProcess; //updateProcess is the event getting fired
        if (temp != null)
        {
            var eventListeners = temp.GetInvocationList();
            foreach (EventHandler e in eventListeners)
            {
                e.BeginInvoke(this, null, EndAsyncImageAcquiredEvent, null);
            }
        }
        else
        {
            throw new FatalException("No handler is attached to the camera's ImageAcquiredEvent");
        }

各スレッドが呼び出す個別のメソッドを作成し、そのメソッドがこのコードを使用して各イベント更新を起動するか、各スレッドが実行するスピンアウト メソッドにこのコードを含める必要があります。

助けてくれてありがとう

4

1 に答える 1

2

クラッシュの原因となる可能性がある、取得しようとしている共有リソースは何ですか? プログレス バーの場合は、UI スレッド自体を介してのみ更新できるため、スレッドから Invoke と InvokeRequired を使用するだけで済みます。参照: InvokeRequired と control.InvokeRequired の使用

他の共有リソースがある場合、 lock を使用する場合、正しく行われた場合 (デッドロックなどがない場合)、コードはスレッドセーフになりますが、パフォーマンスが低下します。

最後に、スレッドの代わりにタスクを使用します: How to update UI from child tasks in WinForms

于 2013-06-04T09:44:42.450 に答える