C# 从任务返回null var hs=new HashSet(); foreach(mainclass中的var项) { Task cl1Task=Task.Factory.StartNew(()=> { 如果(!hs_versionids.Contains(item.VersionID)) { 返回新列表(…); } 其他的 { 返回null; } }); Task.WaitAll(cl1Task); }
它不会等待任务完成。问题在于return null,因此如何返回空任务?您的代码没有意义,原因有两个:C# 从任务返回null var hs=new HashSet(); foreach(mainclass中的var项) { Task cl1Task=Task.Factory.StartNew(()=> { 如果(!hs_versionids.Contains(item.VersionID)) { 返回新列表(…); } 其他的 { 返回null; } }); Task.WaitAll(cl1Task); },c#,task-parallel-library,C#,Task Parallel Library,它不会等待任务完成。问题在于return null,因此如何返回空任务?您的代码没有意义,原因有两个: 启动不包含任何长时间运行的代码的任务是无用的。你不会从中获得任何好处 等待任务在启动后立即完成,完全否定了任务的效果:您仍然在阻塞主线程 如果任务中的代码确实如此简单,请将代码更改为: var hs = new HashSet<int>(); foreach(var item in mainclass) { Task<List<Class1>> c
var hs = new HashSet<int>();
foreach(var item in mainclass)
{
Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() =>
{
if (!hs_VersiodIDs.Contains(item.VersionID))
{
return new List<Class1>(.....);
}
else
{
return null;
}
});
Task.WaitAll(cl1Task );
}
foreach(mainclass中的变量项)
{
列出结果;
如果(!hs_versionids.Contains(item.VersionID))
{
结果=新列表(…);
}
其他的
{
结果=空;
}
}
如果任务中的代码确实做了一些昂贵的事情,请将代码更改为:
foreach(var item in mainclass)
{
List<Class1> result;
if (!hs_VersiodIDs.Contains(item.VersionID))
{
result = new List<Class1>(.....);
}
else
{
result = null;
}
}
var tasks=newlist();
foreach(mainclass中的var项)
{
Task cl1Task=Task.Factory.StartNew(()=>
{
如果(!hs_versionids.Contains(item.VersionID))
{
返回新列表(…);
}
其他的
{
返回null;
}
});
任务。添加(cl1Task);
}
//注意,WaitAll在循环之外,因此现在我们的任务都可以并行运行
Task.WaitAll(tasks.ToArray());
代码不全,我回来时问题就来了null@Haider然后请给出一个简单的例子来说明这个问题。“return null;
”本身并没有什么神奇之处,它本身并不是您遇到任何问题的原因。对不起,这个问题不在这个函数中,而是并行出现的。foreach我在它的列表中添加了一些关于如何使用concurrentbag的一两个值为null的信息,所有这些都工作正常,但性能很低。再一次抱歉all@Haider:“性能很低”-我建议你再次阅读我的答案,并试图明确理解代码毫无意义的第二个原因。@Haider:在这种情况下,你几乎忘记了问题中的每一个重要细节。。。请记住这一点,以便下次使用。
var tasks = new List<Task>();
foreach(var item in mainclass)
{
Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() =>
{
if (!hs_VersiodIDs.Contains(item.VersionID))
{
return new List<Class1>(.....);
}
else
{
return null;
}
});
tasks.Add(cl1Task);
}
// note, WaitAll is outside the loop, so now our tasks can all run in parallel
Task.WaitAll(tasks.ToArray());