あなたが解決しようとしている2つの別々の問題があると思います。
1 つ目は、メイン (UI) スレッドが初期化されていない USB デバイスにアクセスするのを防ぐ方法です。もう 1 つは、「お待ちください」スピナー ダイアログを処理しています。
私の提案は次のとおりです。
BackgroundWworker
USB デバイスの初期化の処理を続けます。
クラスにブール値フィールドを追加して、USB デバイスの初期化が完了したときにフラグを立てます。
private volatile bool _usbDeviceInited = false;
バックグラウンド ワーカーが最後に行うことは、このフラグを に設定することtrue
です。
- プロパティを使用して、USB デバイスへのアクセスを一元化します。USB の初期化が完了していない場合、getter メソッドは boolean フィールドを検査し、null 値を返す (または必要に応じて例外を発生させる) ことができます。
- コードを変更して、USB デバイスへのアクセスを許可するプロパティによって null が返されるかどうか (または、例外を発生させることを選択した場合は例外を処理するかどうか) を確認します。これは、使用する準備ができていないことを意味します。この状態を処理して、USB デバイスの準備ができていないことをユーザーに警告できます。
前の手順は、最初の問題を解決する 1 つの方法です。さて、スピナーです。
RunWorkerCompleted
のイベントにサブスクライブすることをお勧めしますBackgroundWorker
。メイン UI スレッドから作成された場合BackgroundWorker
、イベントはメイン UIThread で発生します (つまり、ユーザー インターフェイス要素とやり取りしても安全です)。そこから、「お待ちください」ダイアログを閉じて破棄するだけです。また、プロパティをチェックしてAsyncCompletedEventArgs.Error
、USB デバイスの初期化中に BackgroundWorker スレッドからエラー状態が発生していないことを確認する必要があります。
編集:
あなたのアプリが USB デバイスにすぐにアクセスしようとするスクリプトを実行する可能性があることを読みました。私が提案したパターンを使用すると、次のように null 以外の値が返されるまで、スクリプトを実行する前にプロパティを「ポーリング」できます。
bool timedOut = false;
DateTime timeout = DateTime.Now.AddSeconds(timeoutSeconds);
while ( MyClass.MyUsbDevice == null ) {
if( DateTime.Now > timeout ) {
timedOut = true;
break;
}
Thread.Sleep(0); // Avoid pegging the CPU, yield it to other processes
}
if( !timedOut ) {
// run the script
} else {
// Handle timeout
}
幸運を!