Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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/5/flutter/10.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#_Asp.net Mvc_Task - Fatal编程技术网

C# 如何执行任务列表?

C# 如何执行任务列表?,c#,asp.net-mvc,task,C#,Asp.net Mvc,Task,我有一个list列表,我想异步添加每个声明。我很好奇如何运行所有任务并设置一个布尔值,以确保所有任务都已运行 foreach (var claim in claims) { claimTasks.Add(UserManager.AddClaimAsync(user.Id, claim)); } claimResultSucceeded = Task.WhenAll(claimTasks).IsCompleted; 我也试过: foreach (var claim in clai

我有一个
list
列表,我想异步添加每个声明。我很好奇如何运行所有任务并设置一个
布尔值
,以确保所有任务都已运行

foreach (var claim in claims)
{
    claimTasks.Add(UserManager.AddClaimAsync(user.Id, claim));   
}

claimResultSucceeded = Task.WhenAll(claimTasks).IsCompleted;
我也试过:

foreach (var claim in claims)
{
    claimTasks.Add(Task.Run(() => UserManager.AddClaimAsync(user.Id, claim)));   
}

claimResultSucceeded = Task.WhenAll(claimTasks).IsCompleted;
编辑:如下图所示,任务处于故障状态:

{“在上一个操作之前在此上下文上启动了第二个操作 异步的 操作已完成。请使用“等待”确保所有异步操作 在此上下文上调用另一个方法之前已完成。任何实例 不能保证成员是线程安全的。“}


你确定吗?Task.WhenAll将接受一组任务(并接受这些任务的任何返回值),然后返回一个新任务,您可以按照建议等待完成吗

我将下面的代码示例放在一起,这基本上就是您所展示的(带有一些无意义的数据,以确保有足够的数据进行编译)-

静态异步void Main(字符串[]args)
{
//声明一些要使用的引用(这些数据是垃圾,只是在这里而已)
//(一切都在整理)
var userManager=newusermanager(null);
var user=新用户();
var索赔=新列表();
var claimTasks=新列表();
//这基本上就是问题中出现的代码——它编译得很好
foreach(索赔中的var索赔)
{
Add(userManager.addclaimsync(user.Id,claim));
}
//Wheall返回单个任务,当所有单个任务
//索赔任务已完成
var claimResults=等待任务.WhenAll(claimTasks);
//发生这种情况时,您应该能够查看每个IdentityResults
//claimResults数组中的实例,以确保它们全部成功
//注意:我在这里有点冒昧,因为我对这些类型不太熟悉,但是
//每个IdentityResult上的successed标志应该指示
//是否已成功检索到它
var allRequestsSucceeded=claimResults.All(c=>c.succeed);
}
//这个结构和类除了使代码编译之外没有其他用途
公共结构密钥:IEquatable
{
public bool Equals(Key other){throw new NotImplementedException();}
}
公共类用户:IUser
{
公钥Id
{
获取{抛出新的NotImplementedException();}
}
公共字符串用户名
{
获取{抛出新的NotImplementedException();}
设置{抛出新的NotImplementedException();}
}
}

您的新错误来自实体框架。每个db上下文实例只能有一个异步操作。只要这样做:

foreach (var claim in claims)
{
    var result = await UserManager.AddClaimAsync(user.Id, claim);
    if (result.Succeded == false) {
        // Handle the error
    }
}
编辑:
合并建议。

您希望
.IsCompleted
做什么?请说明您希望代码执行的操作以及您观察到代码执行的操作。@LasseV.Karlsen.IsCompleted应在执行所有任务后包含true或false结果。我更新了问题的更多细节。@user1477388否,它返回任务当前是否已完成,并立即返回。@Servy,那么根据下面Mike的回答,我如何检查所有任务是否已成功完成?基本上:
wait task.WhenAll(claimTasks)。正如我刚才添加的照片中所示,代码将编译并执行;但是,这些任务永远不会运行。由于发生错误(我以前没有意识到这一点),它们仍然处于故障状态。啊,我明白了。您的问题最初是说您遇到了一个返回类型问题-IdentityResult,您需要一个bool,所以我假设您的代码没有编译。考虑到@Lasse V.Karlen的评论是完全正确的(我不敢相信我最初没有注意到!),我将调整我的答案(为了未来的子孙后代),即“IsCompleted”是错误的检查对象,WhenAll返回的任务应该等待。完成后,您的所有子任务都已完成(成功或失败可能是另一回事)。这样,我如何检查所有任务是否已成功完成?如果在循环中将其调整为“var addClaimResult=wait UserManager.addclaimsync(user.Id,claim);”,则您可以进行检查“addClaimResult.com已成功“每次打电话,如果有人说他们没有成功,就设置一个标志。这种方法不会并行工作,但它是异步的,因为在处理每个addsync调用时线程不会被占用,这是很有价值的。我认为Mike可能比我更了解这些身份类别,这个答案可能比我的好(因此它值得我投赞成票,并且正在得到我的支持)。Good catch@DanRoberts,我编辑了添加内容以检查结果。
foreach (var claim in claims)
{
    var result = await UserManager.AddClaimAsync(user.Id, claim);
    if (result.Succeded == false) {
        // Handle the error
    }
}