学习任务[]

时间:2017-11-01 12:25:07

标签: c#

我正在尝试学习C#多线程。这个问题对某些人来说可能是愚蠢的,但无论如何我仍然会问它。

问题:

我试图找出应该放在哪里(如果我问正确的问题)  thread.wait()方法。因此它可以显示控制台中的所有子线程。这是我想要的输出。

我输入的int num是3。

这应该是输出(我用断点运行它):

enter image description here

这是当前的输出:

enter image description here

这是我的代码:

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Input number of threads: ");
            int num = Convert.ToInt32(Console.ReadLine());

            Task[] TaskArray = new Task[num];

            for (int i = 0; i <= num-1; i++)
            {
                TaskArray[i] = Task.Run(() => { DifferentMethod(i); });                
            }

            for (int i = 0; i <= num - 1; i++)
            {
                TaskArray[i].Wait();
            }
        }
        static void DifferentMethod(object ThreadID)
        {
            while (true)
            {
                Console.WriteLine("{0} is Running",ThreadID);                 
                Thread.Sleep(500);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:5)

这与你的等待部分无关。

您需要制作变量的本地副本:

for (int i = 0; i <= num-1; i++)
{
   int localCopy = i;
   TaskArray[i] = Task.Run(() => { DifferentMethod(localCopy); });                
}

因为您的i已被捕获&#34; (因为没有更好的词)但它已经改变了。因此,您制作本地副本,以便捕获在本地副本上,永远不会更改。

答案 1 :(得分:0)

您可以使用Task类Task.WaitAll(TaskArray)中的静态方法,主线程将在此时等待所有任务完成