2009-03-18 21 views
1

私はc#.netでスレッドを使用した関数を持っています。スレッドが終了した後に文を実行

私はそのスレッドの次の行に別の機能を持っています。しかし、この関数は、スレッドが実行された後にのみ呼び出される必要があります。

どうすればいいですか?あなたは実行が単一スレッドになりたい場合は

例..

Somefunction() 
{ 
    // thread  //(thread started) 
    add()   (another function but need to be executed only tha above thread gets over) 
} 
+0

私は、バックグラウンドスレッドが動作している間はプライマリスレッドを実行し続け、完了したらコールバック関数を実行することを望んでいると思いますか? – Groo

答えて

2

なぜ別のスレッドを開始?

+0

これは、バックグラウンドで操作を開始し、途中で何か他の操作を行い、そのバックグラウンド操作が完了するのを待ってから処理を進める一般的な例です。 –

+0

それは理にかなっていますが、そのOPは何を求めているのではない – cjk

+0

それについては確かですか? –

5

BackgroundWorkerを使用して、関数呼び出しをworker completetedイベントハンドラに含めます。 「スレッドの後に実行されます」によって

var worker = new BackgroundWorker(); 
_worker.DoWork += delegate { DoStuff(); };  
_worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
_worker.RunWorkerAsync(); 


[...] 

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
    /// Do post-thread stuff 
} 
1

、あなたはそれがをを開始している必要があります意味ですか?またはが完了している必要があります

終了したら、通常はJoin()のスレッドになりますが、前に行を見つめたスレッドは表示されません(コードを直接実行するだけです)。もう1つの方法は、スレッド化されたメソッドの最後に "コールバック"を使用することです。

あなたが開始したことを意味した場合は、のようなもの行うことができます:あなたは、例えば、ManualResetEventを使用することができます

object lockObj = new object(); 
lock(lockObj) { 
    ThreadPool.QueueUserWorkItem(delegate { 
     lock(lockObj) { 
      Monitor.Pulse(lockObj); 
     } 
     // do things (we're on the second thread...) 
    }); 
    Monitor.Wait(lockObj); 
} 
// thread has definitely started here 
0

を。 他のスレッドで処理を開始すると、resetメソッドが呼び出されます。 他のスレッドの処理が終了したら、setを呼び出します。 次に、 'main thread'で実行されなければならないメソッドは、実行する前にManualResetEventが設定されるまで待つ必要があります。

詳細については、the ManualResetEventをMSDNでご覧ください。

3

Thread.Joinを使用して、指定されたスレッドが実行を終了するまで現在のスレッドをブロックします。

0

add()がスレッドセーフであれば、スレッドの作成に渡した関数の最後にそれを呼び出してください。

0

あなたは以下のことを試みることができる、それはあなたのシナリオで動作しない可能性があります

public delegate int MyThreadSignature(Something arg); 

が続いて使用します。

まず、デリゲートを作成します。私は、あなたが提供される詳細の量を与えて言うことができません

var thread = new MyThreadSignature(WorkerMethod); 
thread.BeginInvoke(theArg, 
        MyThreadEnded, /*Method to call when done*/, 
        thread /*AsyncState*/); 

MyThreadEndedメソッドを作成します:/終了起動パターンを開始します

を呼び出すメソッドには、例:Name(IAsyncResult result)という名前のシグネチャが必要です(MUST)。

関連する問題