我正在尝试学习C#多线程。这个问题对某些人来说可能是愚蠢的,但无论如何我仍然会问它。
问题:
我试图找出应该放在哪里(如果我问正确的问题)
thread.wait()
方法。因此它可以显示控制台中的所有子线程。这是我想要的输出。
我输入的int num
是3。
这应该是输出(我用断点运行它):
这是当前的输出:
这是我的代码:
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);
}
}
}
}
答案 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)
中的静态方法,主线程将在此时等待所有任务完成