C# 只运行最后一个任务!

C# 只运行最后一个任务!,c#,.net,wpf,task-parallel-library,C#,.net,Wpf,Task Parallel Library,我急切地想找到解决我问题的办法 下面是为列表中的每个项目生成不同任务的代码 List selectedatalist =数据列表。其中( dataList=>(bool)dataList.GetType() .GetProperty(“已检查”) .GetValue(数据列表,新对象[0])==true ).ToList(); this.IsEnabled=false; Task validateMarked=Task.Factory.StartNew(()=> { foreach(选定目录中的

我急切地想找到解决我问题的办法

下面是为
列表中的每个项目生成不同任务的代码

List selectedatalist
=数据列表。其中(
dataList=>(bool)dataList.GetType()
.GetProperty(“已检查”)
.GetValue(数据列表,新对象[0])==true
).ToList();
this.IsEnabled=false;
Task validateMarked=Task.Factory.StartNew(()=>
{
foreach(选定目录中的AccountContactViewModel视图模型)
{
if(viewModel!=null)
{
任务验证=Task.Factory.StartNew(
()=>ValidateAccount(视图模型),
(TaskCreationOptions)TaskContinuationOptions.AttachedToParent);
}
}
});
validateMarked.ContinueWith(x=>this.IsEnabled=true);
现在我的问题是,当它运行时,它只为数组中的最后一项运行。你知道我做错了什么吗


我不想使用
并行。ForEach
因为它没有提供必要的并行效果,无法根据每个任务的完成情况增加进度条。

这可能是一个lambda范围问题

在将viewModel传递给StartNew方法之前,是否尝试将其分配给局部变量

...
Task validateMarked = Task.Factory.StartNew(() =>
{
    foreach (AccountContactViewModel viewModel in selectedDataList)
    {
        var localViewModel = viewModel;
        if (localViewModel != null)
        {
            Task validate = Task.Factory.StartNew(
                () => ValidateAccount(localViewModel),
                (TaskCreationOptions)TaskContinuationOptions.AttachedToParent);
        }
    }
});
...

几乎每天都有人这样问。您正在闭合循环中的一个循环变量。有关详细信息,请参阅。次要的一点是,如果您要做的只是在
foreach
中枚举它,则无需在
数据列表
查询中调用
.ToList()
。Dude为什么必须将viewModel指定给局部变量。我已经看到Resharper对此抱怨过很多次了+顺便说一句,看看Eric Lippert的文章,从对原始问题的评论中。他解释得很好。谢谢
...
Task validateMarked = Task.Factory.StartNew(() =>
{
    foreach (AccountContactViewModel viewModel in selectedDataList)
    {
        var localViewModel = viewModel;
        if (localViewModel != null)
        {
            Task validate = Task.Factory.StartNew(
                () => ValidateAccount(localViewModel),
                (TaskCreationOptions)TaskContinuationOptions.AttachedToParent);
        }
    }
});
...