2011-01-20 3 views
0

私はこれについて読んだことがあります.Join()、主なコードに参加して移動する前に、問題のスレッドがその操作で終了するのを待っているようです。しかし、私の言うところでは、コードが.Join()にスタックしていて、スレッドはもう動いておらず、すでに閉じられているようです。問題のスレッドでヒットしたコードの最後の行はthis.Close()です。どのようなアイデアが起こっているのか、どのように修正するのですか?私のコードがForm2Thread.Join()にスタックされているのはなぜですか?

これは、Windows CEハンドヘルドデバイスで実行されるC#実行可能プログラムです。

また、これは断続的な問題であり、常に発生するとは限りません。

これは、スレッドが起動している:

//Start the thread to continuously receive while the LP dialog is open 
Thread Form2Thread = new Thread(new ThreadStart(this.Nep450_ThreadLowPower)); 

はこれが)(右.Join前のコードです:

else if (Form2.g_IsOKPressed)//This variable is set in the thread in qustionFomr 
         {       
          g_bThreadLowPowerTerminate = true; 
          Thread.Sleep(500); 
          Form2Thread.Join(); 

私は問題の原因を発見しました。次の行がヒットし、2回目のコード実行時に問題が発生しました。一度それを取り除くと、それ以上の問題はありませんでした。

this.Invoke(new EventHandler(CloseLPDialog)); 
+0

コード例は非常に役に立ちます。メインスレッドの一部(スレッドを作成して起動し、 'Join'を実行している部分)を表示することができれば、問題を見つけることができます。 –

答えて

1

プラットフォームがmetterではありません。 Joinは別のスレッドが終了するのを待ちます。ジョインを使用するのを待っているスレッドにトレースやデバッグメッセージを書き込んでみてください。

これを表示する.Nep450_ThreadLowPower関数。 )(参加呼び出す前に、スレッドの状態を確認することをお勧めだろうスタック理由

+0

私は今何をしているのですか、私は試しにキャッチしようとしましたが、それは何かの理由でキャッチを入れさせませんでした。 – Bryan

+0

try-catchをどこに追加していますか?あなたにそれをする能力が与えられていないのは何ですか?そして、これは何をするのですか?多分、スレッドはそのメソッドのスタックですか? Form2Threadクラスは何ですか? –

+0

そして、私は仕事にキャッチしようとしました、私は明らかに間違った場所に入れようとしていました。 This.Close()はスレッド上にあり、コードの実行が終了すると閉じます。 – Bryan

0

があるはずです:

if (aThread.ThreadState == ThreadState.Running) 
{ 

    aThread.Join(); 

} 

EDIT:今、あなたはコードサンプルを掲載しましたことを、私はあなたがチェックすべきだと思います本当にThread.Sleep(500)呼び出しが必要な場合

EDIT#2:上記のコードを修正しました。

+0

そして私は.Threadstate.Runningのオプションを持っていません – Bryan

+0

あなたのスレッドではどうなりますか?多分WaitSleepJoin州にいますか? –

+0

最長のthread.sleep待ち時間は2秒です。私がスレッドのコードに行くと、私は変数のいずれかの値を見ることができないか、スレッドが閉じられていると仮定しているブレークポイントを打つことができません。 – Bryan

関連する問題