Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务:WaitAll()的概念_C#_.net_Multithreading_Task Parallel Library_Task - Fatal编程技术网

C# 任务:WaitAll()的概念

C# 任务:WaitAll()的概念,c#,.net,multithreading,task-parallel-library,task,C#,.net,Multithreading,Task Parallel Library,Task,我在控制台应用程序(不确定这是否与此有关)和使用任务时遇到了一个奇怪的问题 大多数示例都显示有目的地调用异常来测试/解释WaitAll的概念——但在我的例子中,似乎我在做一些根本错误的事情(或者不完全理解) tasktask1=Task.Factory.StartNew(()=>foo(arg)); tasktask2=Task.Factory.StartNew(()=>bar(arg)); Task[]tasks={task1,task2}; 尝试 { Task.WaitAll(tasks);

我在控制台应用程序(不确定这是否与此有关)和使用任务时遇到了一个奇怪的问题

大多数示例都显示有目的地调用异常来测试/解释WaitAll的概念——但在我的例子中,似乎我在做一些根本错误的事情(或者不完全理解)

tasktask1=Task.Factory.StartNew(()=>foo(arg));
tasktask2=Task.Factory.StartNew(()=>bar(arg));
Task[]tasks={task1,task2};
尝试
{
Task.WaitAll(tasks);//点击这里
如果((int)task1.Result*(int)task2.Result==99)//这似乎永远不会被命中
{
System.Environment.Exit(0);//所以不调用它
}
其他的
{
System.Environment.Exit(1);//这两者都不调用
}
}
抓住
{
.....
在上面的例子中,似乎没有命中
if
块,因此既没有返回退出代码,控制台应用程序因此挂起

也没有引发异常-我可以确认这一点,因为所有任务实际上都已完成-为了简洁起见,我没有包含上面的
catch
部分

任务很快就完成了-它们没有挂起,所以它不像Task.WaitAll还在等待-或者可能是,这是我缺少的东西(它在等待什么)


有什么想法、建议或残酷的更正吗?谢谢!

为了论证起见,我做了一个小测试(如下所示)-它表明您的一个任务挂起,并且没有返回值

        Task<int> task1 = Task<int>.Factory.StartNew(() =>
        {
            Thread.Sleep(2000);
            return 10;
        });
        Task<int> task2 = Task<int>.Factory.StartNew(() => 15);
        Task<int>[] tasks = {task1, task2};
        try
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Task.WaitAll(tasks);
            sw.Stop();
            Console.WriteLine(String.Format("tasks completed in {0}ms", sw.ElapsedMilliseconds));
        }
        catch
        {
            Console.WriteLine("Error");
        }
        Console.ReadLine();
Task task1=Task.Factory.StartNew(()=>
{
《睡眠》(2000年);
返回10;
});
tasktask2=Task.Factory.StartNew(()=>15);
Task[]tasks={task1,task2};
尝试
{
秒表sw=新秒表();
sw.Start();
Task.WaitAll(任务);
sw.Stop();
WriteLine(String.Format(“任务在{0}毫秒内完成”,sw.elapsedmillesons));
}
抓住
{
控制台写入线(“错误”);
}
Console.ReadLine();
如果您运行该程序,它将打印2000毫秒内完成的任务(大约需要几毫秒)。我所做的只是复制/粘贴您的代码并添加到我自己的任务中


因此,如果您说“任务[…]未挂起…”这是错误的-它们必须挂起。

为了论证起见,我做了一个小测试(如下所示)-它演示了您的一个任务挂起,并且没有返回值

        Task<int> task1 = Task<int>.Factory.StartNew(() =>
        {
            Thread.Sleep(2000);
            return 10;
        });
        Task<int> task2 = Task<int>.Factory.StartNew(() => 15);
        Task<int>[] tasks = {task1, task2};
        try
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Task.WaitAll(tasks);
            sw.Stop();
            Console.WriteLine(String.Format("tasks completed in {0}ms", sw.ElapsedMilliseconds));
        }
        catch
        {
            Console.WriteLine("Error");
        }
        Console.ReadLine();
Task task1=Task.Factory.StartNew(()=>
{
《睡眠》(2000年);
返回10;
});
tasktask2=Task.Factory.StartNew(()=>15);
Task[]tasks={task1,task2};
尝试
{
秒表sw=新秒表();
sw.Start();
Task.WaitAll(任务);
sw.Stop();
WriteLine(String.Format(“任务在{0}毫秒内完成”,sw.elapsedmillesons));
}
抓住
{
控制台写入线(“错误”);
}
Console.ReadLine();
如果您运行该程序,它将打印2000毫秒内完成的任务(大约需要几毫秒)。我所做的只是复制/粘贴您的代码并添加到我自己的任务中


因此,如果您说
“任务[…]没有挂起…”
这是错误的-它们必须挂起。

正如上面caesay所解释的,任务必须挂起。要检查这一点,我建议为WaitAll调用提供一个默认的超时时间。您可以通过传入一个int来完成此操作,该int表示调用必须等待任务结束的毫秒数。试试这个

Task.WaitAll(tasks, 10000); //Set to wait for 10 seconds
然后看看是否有异常,或者你的“if”语句是否被命中。如果这是有效的,那么用更大的时间间隔进行实验,看看任务发生了什么


此外,我建议运行foo和bar中的代码,而不执行任务(即按顺序)作为一个测试工具,您可以了解这两个示例方法是否存在任何特定问题。

正如caesay在上面解释的,任务必须挂起。要检查这一点,我建议为WaitAll调用指定一个默认超时。您可以通过传递一个int来完成此操作,该int表示调用必须等待的毫秒数要在中结束的任务。请尝试此

Task.WaitAll(tasks, 10000); //Set to wait for 10 seconds
然后看看是否有异常,或者你的“if”语句是否被命中。如果这是有效的,那么用更大的时间间隔进行实验,看看任务发生了什么


此外,我建议运行foo和bar中的代码,而不执行任务(即按顺序)作为测试工具,我们需要了解这两个示例方法是否存在任何特定问题。

我们需要了解更多有关任务的信息。您对WaitAll的理解是正确的,它将在任务完成时返回,或者在任何任务中抛出异常时抛出异常。(请注意,异常)只有在所有任务完成后才会抛出)该代码段确实需要证明foo或bar正在抛出异常。否则,使用调试器诊断此异常应该没有问题,它将清楚地显示捕获块被命中。作为补充说明,您不需要
(int)
强制转换,
结果的类型已经是
(int)
在你的情况下。谢谢大家-我会就此回复你。我将通过@caesay了解任务挂起/不返回值-即使foo或bar确实做了他们需要做的事情,也没有例外/验证-因此我将不得不调查可能两者都不返回值的原因。我们需要了解更多关于任务的信息。你对WaitAll的理解是正确的,它将在任务完成时返回,或者在任何任务中抛出异常时抛出异常。(请注意,只有在所有任务完成后才会抛出异常)。代码段确实需要证明