0

5 つのスレッドを作成するコードがあります。すべてのスレッドが作業を終了し、値が返されるまで待つ必要があります。これどうやってするの?

public static int num=-1;

public int GetValue()
{
    Thread t=null;
    for (int i = 0; i <=5; i++)
    {
        t = new Thread(() => PasswdThread(i));
        t.Start();  
    }

    //how wait all thread, and than return value?   
    return num;
}

public void PasswdThread(int i)
{
    Thread.Sleep(1000);
    Random r=new Random();
    int n=r.Next(10);
    if (n==5)
    {
        num=r.Next(1000);
    }
}

もちろん、これは実際のコードではありません。実際のコードはもっと複雑なので、単純化しました。

PSよく見てください。Task を使用していないため、メソッド Wait() または WaitAll() を使用できません。また、Join() は使用できません。Join は 1 つのスレッドを待機するためです。彼らがすでに作業を終えた待機スレッドを開始すると、無限に待機します。

4

6 に答える 6

2

各スレッドのハンドルを作成してから、メイン スレッドManualResetEventを呼び出します。WaitHandle.WaitAll(handles)

static WaitHandle[] handles = new WaitHandle[5];

`

public void PasswdThread(int i)
{
handles[i] = new ManualResetEvent(false);

 Thread.Sleep(1000);
 Random r=new Random();
 int n=r.Next(10);
 if (n==5)
 {
     num=r.Next(1000);
 }
 handles[i].Set();
}

詳細については、http://msdn.microsoft.com/en-us/library/z6w25xa6.aspxを参照してください。

于 2013-07-01T13:43:55.730 に答える
0

これには TPL を使用します。これは、この種の同期を処理するための最新の手法です。実際のコードはおそらくもっと複雑であるため、例を少し修正します。

public int GetValue()
{
    List<Task<int>> tasks = new List<Task<int>>();
    for (int i = 0; i <=5; i++)
    {
        tasks.Add(PasswdThread(i));
    }

    Task.WaitAll(tasks);

    // You can now query all the tasks:
    foreach (int result in tasks.Select(t => t.Result))
    { 
        if (result == 100) // Do something to pick the desired result...
        {
            return result;
        }
    }

    return -1;
}

public Task<int> PasswdThread(int i)
{
    return Task.Factory.StartNew(() => {
        Thread.Sleep(1000);
        Random r=new Random();
        int n=r.Next(10);
        if (n==5)
        {
            return r.Next(1000);
        }
        return 0;
    });
}
于 2013-07-01T14:09:33.337 に答える
0

使用できると思いますが、そうでない場合は使用Thread.WaitAll(thread_array)することもできますThread.Sleep(100)

ではThread.sleep、100 はミリ秒数です。したがって、この場合、スレッドは 100 ミリ秒間スリープします。

そしてThread.WaitAll-thread_Arrayは、待ちたいスレッドの配列です。

于 2013-07-01T13:53:00.480 に答える
-1
    Thread t=null;
List<Thread> lst = new List<Thread();
    for (int i = 0; i <=5; i++)
    {
         t = new Thread(() => PasswdThread(i));
         lst.Add(t);
         t.Start();  
    }

    //how wait all thread, and than return value?   
foreach(var item in lst)
{
    while(item.IsAlive)
    {
         Thread.Sleep(5);
    }
}
    return num;
于 2013-07-01T13:58:45.323 に答える