Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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/1/amazon-web-services/13.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# 任务等待任何条件_C#_Task Parallel Library - Fatal编程技术网

C# 任务等待任何条件

C# 任务等待任何条件,c#,task-parallel-library,C#,Task Parallel Library,我找到了一些使用Task.WaitAny条件的代码 Task<int>[] tasks = new Task<int>[3]; tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; }); tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; }); tasks[2] = Task.Run(() => { Thread.Sleep

我找到了一些使用Task.WaitAny条件的代码

Task<int>[] tasks = new Task<int>[3];

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(3000); return 3; });

while (tasks.Length > 0) {
    int i = Task.WaitAny(tasks);
    Task<int> completedTask = tasks[i];

    Console.WriteLine(completedTask.Result);

    var temp = tasks.ToList();
    temp.RemoveAt(i);
    tasks = temp.ToArray();
}
Task[]tasks=新任务[3];
tasks[0]=Task.Run(()=>{Thread.Sleep(2000);返回1;});
tasks[1]=Task.Run(()=>{Thread.Sleep(1000);返回2;});
tasks[2]=Task.Run(()=>{Thread.Sleep(3000);返回3;});
而(tasks.Length>0){
int i=Task.WaitAny(任务);
Task completedTask=任务[i];
Console.WriteLine(completedTask.Result);
var temp=tasks.ToList();
移除温度(i);
tasks=临时ToArray();
}
代码运行良好,结果是2113

当我试图改变睡眠间隔时

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(1000); return 3; });

while (tasks.Length > 0) {
    int i = Task.WaitAny(tasks);
    Task<int> completedTask = tasks[i];

    Console.WriteLine(completedTask.Result);

    var temp = tasks.ToList();
    temp.RemoveAt(i);
    tasks = temp.ToArray();
}
tasks[0]=Task.Run(()=>{Thread.Sleep(2000);返回1;});
tasks[1]=Task.Run(()=>{Thread.Sleep(1000);返回2;});
tasks[2]=Task.Run(()=>{Thread.Sleep(1000);返回3;});
而(tasks.Length>0){
int i=Task.WaitAny(任务);
Task completedTask=任务[i];
Console.WriteLine(completedTask.Result);
var temp=tasks.ToList();
移除温度(i);
tasks=临时ToArray();
}
尽管第二项任务是睡眠时间最少的任务,而且应该是第一个被移除的任务,但我还是得到了123分


引擎盖下发生了什么?

Thread.Sleep将程序暂停指定的毫秒数是相当准确的

Sleep(1000)意味着任务在1000毫秒后可以执行


但在所有可用任务中,首先执行哪个任务是由任务调度器决定的,它根据线程池中的线程数和许多其他因素来决定任务的执行顺序

也许是时间问题。将睡眠间隔增加10倍以排除这种情况。无法再现-我得到“(暂停)2,3(暂停)1”或“(暂停)3,2(暂停)1”-如预期。你的电脑上有多少内核?有没有可能是因为你只有一个核心,所以需要花时间来提升员工?顺便问一下,1000,1000是一个打字错误?其中一个应该是3000吗?@user1648371这是否意味着您正在虚拟单核机器上运行此代码?如果是这样的话,我认为Marc是对的:
ThreadPool
可以快速创建与内核数量相同的线程,但创建额外线程的速度较慢。我检查了VMWare选项,Windows仅使用一个处理器运行。增加这个数字可以解决这个问题。从中找出答案,我会接受的。