在与异步方面的foreach中找到“连接不支持多重反应的人” 我使用Dapper.simplecrud具有以下代码: var test = new fallenvormentalCondition [] { 新的fallenvironmentalcontition {id = 40,fallid = 3,emoventeralConditionID = 1}, 新

问题描述 投票:0回答:3
在此代码中,我得到以下例外:

invalidoperationException:连接不支持多重反应viveresultsetsetsets

我不明白我正在每个更新,所以为什么要遇到此错误。
注:我无法控制连接字符串,所以我无法打开火星。

您需要在连接字符串中添加属性

await

并将其设置为true,以允许多个活动的结果集。 

MultipleActiveResultSets

阅读更多信息:
c# sql-server foreach async-await dapper
3个回答
85
投票


问题是
方向方法

不是异步方法。它不会等待您的lambda返回的任务。运行该代码将启动每个任务,而不必等待完成其中的任何一个任务。 penter点:将lambda标记为异步不是一种同步方法,您将其表现为异步。 solution:您将需要使用一个等待任务完成的foreach循环。

eg:foreach(xs中的var x)等待f(x);

37
投票
(我知道这是一个古老的问题,但我认为这没有清楚地回答)

"Data Source=MSSQL1;" & _ "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" & _ "MultipleActiveResultSets=True" 代码启动列表中每个项目的任务,但是在开始下一个任务之前,不要等待每个任务完成。在每个任务中,它等待更新完成。 尝试 test.ToList().ForEach(async x => await conn.UpdateAsync(x)); 等于

Enumerable.Range(1, 10).ToList().ForEach(async i => await Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now)));

如果您使用的非迅速方法,则必须等待(),而不是等待每个任务。 例如

foreach (var i in Enumerable.Range(1, 10).ToList() ) { var task = Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now)); }

Mars有一些局限性,也有非零的开销。您可以使用以下助手进行更新顺序:

foreach (var i in Enumerable.Range(1, 10).ToList() ) { var task = Task.Delay(1000).ContinueWith(t => Console.WriteLine(DateTime.Now)); //possibly do other stuff on this thread task.Wait(); //wait for this task to complete }

因此,您的榜样会变成

33
投票
public static async Task WhenAllOneByOne<T>(this IEnumerable<T> source, Func<T, Task> process) { foreach (var item in source) await process(item); } public static async Task<List<U>> WhenAllOneByOne<T, U>(this IEnumerable<T> source, Func<T, Task<U>> transform) { var results = new List<U>(); foreach (var item in source) results.Add(await transform(item)); return results; // I would use yield return but unfortunately it is not supported in async methods }
我通常将第二个助手致电

await test.WhenAllOneByOne(conn.UpdateAsync);

,如下:
Task.WhenAll


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.