1

サードパーティのライブラリを使用していますが、ライブラリの一部の機能の実行に時間がかかるため、機能がビジー状態のときに「お待ちください」ダイアログを表示したいと思います。

通常、私は次のようなことをします:

Thread longTask = new Thread (new ThreadStart(LongTask));
longTask.IsBackgroud = true;
longTask.Start();

pleaseWaitForm = new PleasWaitForm ("Please wait for task to complete");
pleaseWaitForm.ShowDialog();

void LongTask()
{
    // Do time consuming work here

    pleaseWaitForm.CanCloseFlag = true;
}

残念ながら、サードパーティのライブラリはスレッドセーフではありません。回避策はありますか?ダイアログボックスをバックグラウンドタスクとして管理する方法はありますか?

4

3 に答える 3

2

「スレッドセーフ」の意味を誤解していると思います。シングル スレッドからのみサードパーティ コンポーネントのメソッド/プロパティを呼び出す場合、コンポーネントはスレッド セーフである必要はありません。この記事を参照してください。

さらに、この場合はバックグラウンド ワーカークラスを使用することをお勧めします。

HTH

于 2009-11-16T19:30:07.037 に答える
1

独自のダイアログボックスを作成する必要があります。

1つのオプションはcompleted、タイマーなどでフラグをポーリングすることです。

さらに別のオプションは、フォームにタスクを「所有」させ、BackgroundWorker進行状況と完了の通知にを使用することです。

于 2009-11-16T19:23:16.130 に答える
0

メソッド LongTask があり、スレッド セーフではないとします。そのメソッドが実行中で、共有変数を必要としない場合は、単純にラップしてBackgroundWorker、タスクが終了した瞬間に「お待ちください」画面を更新できます。

特定のメソッドがスレッド セーフでない場合、それはスレッドで安全に使用できることを意味しますが、複数回非同期で実行するか (危険です!)、同期的に実行するか (問題ではありません) に依存します。

于 2009-11-16T19:25:23.847 に答える