invalidoperationException:连接不支持多重反应viveresultsetsetsets
我不明白我正在每个更新,所以为什么要遇到此错误。
注:我无法控制连接字符串,所以我无法打开火星。您需要在连接字符串中添加属性
await
并将其设置为true,以允许多个活动的结果集。
MultipleActiveResultSets
阅读更多信息:
问题是
方向方法
不是异步方法。它不会等待您的lambda返回的任务。运行该代码将启动每个任务,而不必等待完成其中的任何一个任务。 penter点:将lambda标记为异步不是一种同步方法,您将其表现为异步。 solution:您将需要使用一个等待任务完成的foreach循环。
eg:foreach(xs中的var x)等待f(x);
"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
}
因此,您的榜样会变成
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