2009-05-17 12 views
0

私はlistoddataとメインスレッドのスレッドのリストを持っています.iリストの各要素データを対応するスレッドに渡しています。すべてのスレッドが実行されるまでメインスレッドを待ちます。asp.net:複数のスレッドオブジェクトで結合メソッドを呼び出すには?

for (int i = 0; i < listOfThread.Count; i++) 
      { 
       listOfThread[i].Join(); 

      } 
// code after all of thread completes its work 
//code block2 

任意スレッド0 .CODEブロックが実行される完了した場合、このループメインスレッドの最初の反復がexecuted.andされません後。それは私が望んでいない。

答えて

3

これは、複数のスレッド上joinに完全に有効な方法です:

は、ここでは、コードです。すべてのスレッドを待っていても、順番にでもうまくいくでしょう。すでに完了しているスレッドを待つ必要はありません。スレッドがまだ実行中の場合、そのスレッドが完了するまで待機します。

1

Sahil、あなたはすべてのスレッドの結合がそれぞれ実行するのを待たずに呼び出されるようにして、何を達成しようとしていますか?パフォーマンスのためには、それはあまり役に立ちません。なぜなら、あなたがすべてのスレッド上でthread.joinを呼び出していても、先に進む前に各スレッドが終了するのを待たなければならないからです。 1つのstmt内のすべてのスレッド上で待機しているのは直接的な方法はありません

はとにかくあなたがする必要がある場合は、ここで私が言っているものです。代わりにいくつかの後にR & D私は少し間接的な方法を思い付いた。スレッドを初期化してParameterizedThreadDelegateを渡す代わりに、ParameterizedThreadDelegateで直接BeginInvokeを実行できます。 WaitHandle.WaitAllを使用すると、すべてのデリゲートが先に実行を完了するのを待つことができます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<ParameterizedThreadStart> listDelegates = new List<ParameterizedThreadStart>(); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Print)); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Display)); 

     List<WaitHandle> listWaitHandles = new List<WaitHandle>(); 

     foreach (ParameterizedThreadStart t in listDelegates) 
      listWaitHandles.Add(t.BeginInvoke("In Thread", null, null).AsyncWaitHandle); 

     WaitHandle.WaitAll(listWaitHandles.ToArray()); 

     Console.WriteLine("All threads executed"); 

     Console.Read(); 

    } 
} 

public class DelegateEg 
{ 
    public static void Print(object obj) 
    { 
     Console.WriteLine("In print"); 
     Console.WriteLine(obj); 
    } 

    public static void Display(object obj) 
    { 
     Console.WriteLine("In Display"); 
     Console.WriteLine(obj); 

    } 
} 
+0

私は愚かだったと思います。フィッシャーは正しいです。既にうまく動作しています。 –

+1

はい...私は同じことを暗示しました...とにかくそれは私にとって良いr&dでした:) –

関連する問題