アプリケーションでスレッドを使用しようとしたのは初めてです。 私はこの質問が以前に尋ねられたことを知っていますが、私が見た解決策は私の状況でそれらを適用する方法を見ることができません。c#別のスレッドを開始する前にスレッドをチェックする方法は完了しました
データグリービューが60秒ごとにタイマーでリフレッシュされるプログラムがあります。データはSQLデータベースから得られます。このタイマーはワーカースレッドを開始して、特定のBluetoothデバイスを検索し、バックグラウンドでの検出結果に基づいてデータベースを更新します。ブルートゥースのルックアップは特に遅いので、私はそれをワーカースレッドに入れています。
私の問題は、新しいワーカースレッドが前のスレッドが終了する前に開始されることがあります。少なくとも、それは私が得ているエラーの唯一の論理的な説明です。大きな問題は、ファイルをロックできる唯一のことが同じアプリケーションの別のワーカースレッドである場合、ファイルロックエラーです。
私はバックグラウンドスレッドを開始するために使用しているコードです。
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Run the Bluetooth Search in a worker thread
Thread thread = new Thread(new ThreadStart(this.checkProximity));
thread.IsBackground = true;
thread.Start();
}
// Load User Data from the DB and display on the screen
loadUserData();
}
解決策がthread.IsAlive()を使用することですが、私は良い例を見つけることができていないように見えるだろう。 "Thread thread = new Thread()"を使って新しいスレッドを作成したばかりのスレッドの存在を確認しようとするのは、奇妙に思えます。
明らかに私は何かが不足しています。 I私は変更...私はこれを試してみました下のkrw12572によって提案された解決策に基づいてUPDATE
をデビッド
のVisual Studioにを
を任意のアイデアを2008年 感謝を使用しています!=に==私はまだ毎回、プライマリスレッドでloadUserData()メソッドを実行したいからです。
エディタでフィールドが割り当てられていないことを示す「_bluetoothSearchThread」の緑色の下線が表示され、常に値がNULLになります。
実行時に、この行に「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。
if (_bluetoothSearchThread == null && _bluetoothSearchThread.IsAlive)
この値はどのように割り当てられますか?
private Thread _bluetoothSearchThread;
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// Check if Worker Thread is already running.
if (_bluetoothSearchThread == null && _bluetoothSearchThread.IsAlive)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Previous Worker Thread not running");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Check if the users mobile phone is within range
// Run the Bluetooth Search in a worker thread
Thread thread = new Thread(new ThreadStart(this.checkProximity));
thread.IsBackground = true;
thread.Start();
}
}
else
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Worker Thread still running don't start another one");
}
// Load User Data from the DB and display on the screen
loadUserData();
}
アップデート2
OK私は、私はそれを考え出したと思います。 != Nullを元の状態に戻して、IFとそれ以外の方法を逆にしました。
は、その後、私は私の脳ビットを使用していたと「_bluetoothSearchThread」今のコードはコンパイルして実行するには、「スレッド」に変更しました。今では、ファイルロックエラーの原因となっている条件をトリガーして、実際に元の問題を修正したかどうかを確認するだけです。それがうまくいけば、私はkrw12572の答えを正しいとマークします。
更新2。5 は、私もそれがあまりにも早く
_bluetoothSearchThread = new Thread(new ThreadStart(this.checkProximity));
新しいインスタンスを作成しませんので、これは実用的なソリューションがあるので、この線を移動しなければなりませんでした。
private Thread _bluetoothSearchThread;
private void timerScreenRefresh_Tick(object sender, EventArgs e)
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "");
// Check if Worker Thread is already running.
if (_bluetoothSearchThread != null && _bluetoothSearchThread.IsAlive)
{
// Thread is still running. Just log it and move on.
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "******** Worker Thread still running don't start another one *********");
}
else
{
if (LocalUtilities.Debug > 3) LocalUtilities.writeLogFile(4, "Primary", LocalUtilities.getCurrentMethod() + "()", "Previous Worker Thread not running");
// If the user is not on a Remote desktop connection
if (!remoteDesktopUser)
{
// Check if the users mobile phone is within range
// Run the Bluetooth Search in a worker thread
_bluetoothSearchThread = new Thread(new ThreadStart(this.checkProximity));
_bluetoothSearchThread.IsBackground = true;
_bluetoothSearchThread.Start();
}
}
// Load User Data from the DB and display on the screen
loadUserData();
}
ここにあなたの結果:http://stackoverflow.com/questions/12949024/detecting-a-thread-is-already-running-in-c-sharp-net –
@BALA私はその解決策を以前に見ました。それは過度に複雑に思え、私はそれを本当に理解していませんでした。私は明日それを盲目的に追いかけ、実行可能なものが出てくるかどうかを見てみましょう。 –
[スレッドが実行を終了したかどうかをチェックする方法]の複製があります(http://stackoverflow.com/questions/2773479/how-to-check-if-thread-finished-execution) –