1

バックグラウンドワーカーがキャンセルされるのを待つ方法の回答を読みましたか? 、しかし、私は特定の問題の解決策を見つけることができませんでした:

私のアプリは大量のデータをロードする必要がありますが、ほとんどの場合、このデータはアプリの開始直後には必要ありません。

ユーザーが実際にデータを要求したときの遅延を最小限に抑えるために、アプリの起動時に起動する BackgroundWorker を使用してデータを読み込みます。うまくいけば、ユーザーがデータを要求した時点で、BackgroundWorker は完了しています。

ただし、場合によっては、そうでない場合もあります。このような場合、ユーザーに何かを表示する前に、読み込みが完了するのを待ちたいと思います。

私が考えることができるすべての手法には競合状態があります。たとえば、を設定した場合、ユーザーがデータを要求したときにAutoResetEvent使用できません。ブール値フラグを追加して、 WaitOne を呼び出す前にそれをチェックすると、ckecing の後、WaitOne 呼び出しの前に true に設定される可能性があり、返されません...WaitOne()AutoResetEventloading_completeloading_complete

何か案が?

編集:解決策については @ 500-InternalServerError に感謝します。ManualResetEvent素晴らしい作品を使用しています。提案をしてくれた他のみんなに感謝します。

4

4 に答える 4

0

によってロックされた単純なミューテックスを使用し、BackgroundWorker他のスレッドが完了を待って取得および解放するようにします。完了したらBackgroundWorker、ロックを解除すると、他のすべてのスレッドが作業を続行できるようになります。

これを行う特定の C# の方法があるかもしれません ( Monitor クラスが便利かもしれません)。

更新:実際、問題を解決するために必要なオブジェクトは、ラッチとして機能する条件変数の形式であり、OP が述べたように、ManualResetEventその特定のニーズをカバーしています。

于 2012-12-14T23:24:47.023 に答える
0

バックグラウンド ワーカーは RunWorkerCompleted イベントをサポートします。このイベントは、読み込みが完了したかどうかを判断するために使用できます。

2つの条件があります

  • ワーカーの完了後にユーザーがデータを要求しました。

複雑さを軽減するために、バックグラウンド ワーカーがデータの読み込みを開始したときに false に設定される boolean メンバー変数を追加できます。データが読み込まれると、runworkercompleted イベントが発生し、変数が true に設定され、データが読み込まれたかどうかを判断するのに役立ちます。

  • ワーカーが完了する前にユーザーがデータを要求し (上記の bool 変数から判断できます)、データのロードを待機しています。

ユーザーがデータを要求すると、次のようなフラグ/別の bool 変数を設定できます。

WaitingForData = true;

RunWorkerCompleted イベントが発生すると、WaitingForData のステータスがチェックされ、true の場合はデータが表示されます。これにより、スレッドの完了を待つ必要がなくなります。

この方法を使用すると、競合状態やスレッド間通信を回避できます。

于 2012-12-15T03:56:52.073 に答える
0

WorkCompleted イベント ハンドラーで BackgroundWorker が完了したら、何が起こるかを設定します。

于 2012-12-14T23:05:02.233 に答える
-1

ブール値フラグを使用し、バックグラウンド ワーカーの完了イベント ハンドラーで true に設定します。

データがロードされているかどうかを確認する必要がある場合は、変数を確認してください。

競合状態を回避するために、アクセスする前に必ずロックしてください。

要求されたときにデータの準備ができていない場合は、その時点で別のイベント ハンドラーをバックグラウンド ワーカーの完了イベントに追加できます。これにより、データに対して必要な処理が実行されます。

于 2012-12-14T23:34:51.750 に答える