C# 任务等待任何条件
我找到了一些使用Task.WaitAny条件的代码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<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仅使用一个处理器运行。增加这个数字可以解决这个问题。从中找出答案,我会接受的。