2011-11-14 13 views
0

私のWinフォームがスレッドを実行していると私はそれが行われます一度それがメインスレッドに通知する必要があり、その後、メインスレッドが戻って正常な状態にプログレスバーを設定することができます。スレッド1が再帰的であるため、スレッドが完了すると、メインスレッドに通知

現在、私は何を持っていることは、スレッド2に

------begin--------- 
// codes before.... 
call thread one.... 
create thread two instance then start thread two 
---------end------------------ 

を、次のようなものがあり、私はこれをしなかった代わりに、スレッド1でVARを入れ

--------begin------ 
while(threadOne.isalive){ 
    Thread.Sleep(500); 
} 
call setProgressbar delegate 
---------end---------------- 

されてい方法.... .... これを行う正しい方法は、誰かを助けることができますか? ありがとう

+0

あなたは、イベントベースのアプローチについて考えています。例:EventWaitHandle(AutoresetまたはManualReset) –

答えて

2

編集:あなたの明示的な質問に答える答えがありますが、.NET 4を使用している場合は、代わりに抽象度の高いレベルで考えることをお勧めします。タスクパラレルライブラリは、「裸の」スレッドよりも豊富な機能を公開しており、継続登録(Task.ContinueWith)のようなことができます。そこには、使用するタスクスケジューラを指定することもできます。タスクが終了したら、UIスレッドの特定のアクションをと呼びます。


オリジナル答え

例えば、最初のスレッドの責任を委譲することであろう最も簡単な方法

public void WrappedStart() 
{ 
    bool success = false; 
    try 
    { 
     StartWork(); 
     success = true; 
    } 
    finally 
    { 
     NotifyCompleted(success); 
    } 
} 

private void StartWork() 
{ 
    // Do your real work here 
} 

... 

Thread t = new Thread(WrappedStart); 
t.Start(); 

あなたのスレッドが異なることを行う可能性がある場合、あなたがラップするために行動を取るためにあなたのWrapperStartを変更することができます:

public void WrappedStart(Action action) 
{ 
    ... 
} 

その後:

Thread t = new Thread(() => WrappedStart(RealWork)); 
t.Start(); 

(注)を行う場合ということマルチスレッドソリューションが必要な場合は、明示的にループする代わりにThread.Joinを使用してください。

+0

私は前に参加しようとしましたが、何らかの理由で自分のプログラムがハングアップするだけです。 – ikel

+0

@ikel:あなたはどのスレッドから呼び出していましたか?たとえば、UIスレッドから「Join」を呼び出すことは望ましくありません。 (あなたはUIスレッドからの呼び出しのような*ブロッキング呼び出しをしてはいけません) –

+0

私はあなたのメソッドを試してここに戻ります。 – ikel

0
  1. プログレスバーの更新を処理するためのデリゲートを定義します。
  2. 子スレッドで進捗状況が発生した場合は、BeginInvokeを使用して、定義されたデリゲートを呼び出してUIを更新します。
+0

で作業を正常にテストしましたが、スレッド1は再帰的です。 – ikel

+0

再帰で終了条件がありませんか? – Tudor

+0

はい、それは子供== nullの場合は、次に停止します – ikel

関連する問題