【问题标题】:ArgumentException isn't thrown on Task.WaitAll(new Task[0])未在 Task.WaitAll(new Task[0]) 上引发 ArgumentException
【发布时间】:2017-02-22 11:01:23
【问题描述】:

当我阅读 Task.WaitAll(params Task[] tasks) 上的 MSDN 文档时,它说它会在以下情况下引发 ArgumentException:

tasks 参数包含一个空元素。

-或-

tasks 参数是一个空数组。

但是当我调用Task.WaitAll(new Task[0]); 时,它会毫无例外地继续。

我是否误解了文档,或者这只是一个错误(或过时的信息)?

我知道Task.WhenAll(new Task[0]) 也这样做,当然除了返回一个任务。这个feature was sometimes used to get a completed task,在.NET 4.6 中引入Task.CompletedTask 之前。

我真的很高兴Task.WaitAll() 似乎有这种行为,因此我不必将空数组视为特殊情况,但我仍然想确保我理解正确。

顺便说一句,我正在 4.5.2 上运行我的应用程序。但我刚刚做了一个针对 4.6.1 的新解决方案,它的行为方式相同。

【问题讨论】:

  • 文档在VS 10VS 11 之间肯定发生了变化——特别是它添加了tasks argument is an empty array 文本——很有趣。我的钱是文档错误...

标签: c# task msdn


【解决方案1】:

这似乎是一个错误的文档。根据源代码(Can be found here 或通过 Resharper) ArgumentException 仅在以下情况下引发:

参数是null:

5043     if (tasks == null)
5044     {
5045        throw new ArgumentNullException("tasks");
5046     }

或者数组的元素之一是`null':

5070    // Collects incomplete tasks in "waitedOnTaskList"
5071    for (int i = tasks.Length - 1; i >= 0; i--)
5072    {
5073        Task task = tasks[i];
5074
5075        if (task == null)
5076        {
5077            throw new ArgumentException(Environment.GetResourceString("Task_WaitMulti_NullTask"), "tasks");
5078        }

我在代码中找不到对空数组的任何检查。

PS:我在看 .NET Framework 4.6.2 源代码

【讨论】:

    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多