C# 带任务的foreach循环
我需要用3个任务做一个foreach循环,这需要等到所有3个任务都完成,然后移动到下一个任务。 差不多C# 带任务的foreach循环,c#,.net,loops,foreach,task,C#,.net,Loops,Foreach,Task,我需要用3个任务做一个foreach循环,这需要等到所有3个任务都完成,然后移动到下一个任务。 差不多 foreach (class r in sets) { Task.Factory.StartNew(() => { DoThisFunction1(); }, TaskCreationOptions.LongRunning); Task.Factory.StartNew(() => { DoThisFunction2(); },
foreach (class r in sets)
{
Task.Factory.StartNew(() => {
DoThisFunction1();
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() => {
DoThisFunction2();
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() => {
DoThisFunction3();
}, TaskCreationOptions.LongRunning);
}
有人可以给出一个简单的方法来实现这一点。您可以使用没有返回类型且将在任务上阻止simular toWait
,或者将返回等待的任务
例如:
var tasks = new Task[] {
Task.Factory.StartNew(() => {
DoThisFunction1();
}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => {
DoThisFunction2();
}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => {
DoThisFunction3();
}, TaskCreationOptions.LongRunning)
};
Task.WaitAll(tasks);
// or
await Task.WhenAll(tasks);
更详细的答案可以在类任务测试中找到
{
公开无效测试()
{
列表集=新列表
{
“set1”、“set2”、“set3”、“set4”,
};
foreach(变量s在集合中)
{
WriteLine(“Set{0}”,s);
var tasks=new[]
{
Task.Factory.StartNew(()=>{DoThisFunction1();},TaskCreationOptions.LongRunning),
Task.Factory.StartNew(()=>{DoThisFunction2();},TaskCreationOptions.LongRunning),
Task.Factory.StartNew(()=>{DoThisFunction3();},TaskCreationOptions.LongRunning),
};
Task.WaitAll(任务);
WriteLine(“结束集{0}\n------”,s);
}
}
void DoThisFunction1()
{
睡眠(1000);
控制台写入线(“F1”);
}
void DoThisFunction2()
{
睡眠(1500);
控制台写入线(“F2”);
}
void DoThisFunction3()
{
《睡眠》(2000年);
控制台写入线(“F3”);
}
}
这么简单?哇,我一直在找这个。。。谢谢顺便说一句,与标准副本相比,这是一个非常低质量的答案…@AlexeiLevenkov我是否应该根据您提供的样本进行改进,或者这不重要,因为这是一个副本?@Dr.Fre如果您的答案比链接副本中已有的答案更好,请确实提供给,否则我认为不值得你花时间来改进这个(它本身很好,只是没有比现有的一次有用多少)
class TasksTest
{
public void Test()
{
List<string> sets = new List<string>
{
"set1", "set2", "set3", "set4",
};
foreach (var s in sets)
{
Console.WriteLine("Set {0}", s);
var tasks = new[]
{
Task.Factory.StartNew(() => {DoThisFunction1();}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => { DoThisFunction2(); }, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => { DoThisFunction3(); }, TaskCreationOptions.LongRunning),
};
Task.WaitAll(tasks);
Console.WriteLine("End Set {0}\n------------", s);
}
}
void DoThisFunction1()
{
Thread.Sleep(1000);
Console.WriteLine("F1");
}
void DoThisFunction2()
{
Thread.Sleep(1500);
Console.WriteLine("F2");
}
void DoThisFunction3()
{
Thread.Sleep(2000);
Console.WriteLine("F3");
}
}