diff options
author | Stephen Toub <stoub@microsoft.com> | 2021-07-14 03:10:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-14 03:10:24 +0300 |
commit | bf0fdf0a78a1411f5abed5d892dcac2ba21899e1 (patch) | |
tree | 088bdfca85f75742f9b0556e7f5db4b8d8527059 /src | |
parent | ccfe21882e4a2206ce49cd5b32d3eb3cab3e530f (diff) |
Fix Task.WhenAny failure mode when passed ICollection of zero tasks (#55580)
Diffstat (limited to 'src')
-rw-r--r-- | src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs | 8 | ||||
-rw-r--r-- | src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs | 14 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs index a64dc008429..89fab991d73 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs @@ -6305,8 +6305,14 @@ namespace System.Threading.Tasks return WhenAny(taskArray); } + int count = taskCollection.Count; + if (count <= 0) + { + ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks); + } + int index = 0; - taskArray = new Task[taskCollection.Count]; + taskArray = new Task[count]; foreach (Task task in tasks) { if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); diff --git a/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs b/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs index e696a38cf92..923875f6e43 100644 --- a/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs +++ b/src/libraries/System.Threading.Tasks/tests/MethodCoverage.cs @@ -189,6 +189,20 @@ namespace TaskCoverage } [Fact] + public static void Task_WhenAny_NoTasks_Throws() + { + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task[0]); }); + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task>()); }); + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task>()); }); + + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new Task<int>[0]); }); + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(new List<Task<int>>()); }); + AssertExtensions.Throws<ArgumentException>("tasks", () => { Task.WhenAny(EmptyIterator<Task<int>>()); }); + + static IEnumerable<T> EmptyIterator<T>() { yield break; } + } + + [Fact] public static async Task Task_WhenAny_TwoTasks_OnePreCompleted() { Task<int> t1 = Task.FromResult(1); |