2009-04-08 5 views
0

私のWindowsアプリケーションでは、私は順番に他のいくつかのusercontrolをホストするusercontrolを持っています。私のスレッドは作成されていないようです...どんな考えですか?

ただ、メインのユーザーコントロールのコンストラクタの終了前に、私はスレッドを作成しようと...しかし、作成されていないよう:

mainUserControl() 
{ 
    var t=new Thread(ThreadJob); 
    t.IsBackground=true; 
    t.Start(); 
} 


private void ThreadJob() 
{ 
    //Thread.Sleep(120000); 
    //if(txtStatus.InvokeRequired) { 
    // txtStatus.Invoke(new MethodInvoker(delegate { txtStatus.Text="Thread started"; })); 
    //} 

    txtStatus.Text="sample"; 
} 

このコードは動作しません:私はこれを取りますスレッドが生成されていないという証拠がある場合は、txtStatus.Text="sample";のように例外がスローされました....そうですか?

ここで何が起こっていますか?なぜ私のスレッドが作成されていないのですか?

答えて

1

私の推測では、スレッドが産卵、値を設定し、シャットダウンされています。

間違ったスレッドからtxtStatus.Textにアクセスすることはできません。バックグラウンドスレッドからコントロールのプロパティにアクセスでき、スローされない状況があります。 (あなたはまだそれをしてはいけません!)

スレッドがまだ起動していないと思われる場合は、そこにブレークポイントを設定してみてください。そのポイントに当たることがわかります。

1

バックグラウンドスレッドは、一般にUIスレッド作成コンポーネントにアクセスできません。私の提案は、ThreadJobにtry catchを追加することですが、UIのスレッドコンポーネントに直接アクセスするように設計されているため、BackgroundWorkerを使用するのが最善の方法です(よくわかりません:-)

3

例外がスローされました。それはあるかもしれないが、もう一度それはちょうどうまく動作しなかったかもしれない。クロススレッドのUIアクセスが推奨されない理由は、薄れて危険です。全体的に、あなたのプログラムを検証するための良い方法は、そうするべきだと思うように設定されていません。あなたは遅れを取ったので、

は、ブレークポイントとデバッガを使用して...

+0

またはVSの出力ウィンドウに表示されるDebug.WriteLine。 – Richard

+0

@リチャード:ええ、それも良いです。 – Shog9

0

フォームのスレッド例外がスローされなかったのは、ではありません。スレッドが実行されなかったという良い証拠です。あなたのスレッドの実行を確認するためのやや良い方法:割り当てをConsole.Out.WriteLine("sample")に置き換え、コンソール出力を確認してください。

-1

ThreadStartオブジェクトは使用しないでください。

のように:私は問題が、すべての時間なしThreadStartとParamatizedThreadStartオブジェクトを使用

Thread t = new Thread(new ThreadStart(ThreadJob)); 

。この例外を無効にしない限り、他のスレッドで作成されたUIオブジェクトには絶対アクセスしないようにしてください。

デビット

関連する問題