Woo*_*193 9 c# sql parallel-processing
我有一个SQL连接服务,我正在尝试构建.我基本上这样做:
var data = await GetDataFromFlatFilesAsync(dir).ConfigureAwait(false);
using (var conn = new SqlConnection(MyConnectionString))
{
try
{
conn.Open();
var rw = new SqlReaderWriter(conn);
await DoStuffWithSqlAsync(rw, data).ConfigureAwait(false);
}
catch (Exception ex)
{
// Do exceptional stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
DoStuffWithSqlAsync 像这样运作:
private async Task DoStuffWithSqlAsync(SqlReaderWriter rw, IEnumerable<Thing> data)
{
await Task.WhenAll(data.Select(rw.RunQueryAsync)).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
并RunQueryAsync按此操作:
public async Task RunQueryAsync<T>(T content)
{
// _conn is assigned to in the constructor with conn
try
{
var dataQuery = _conn.CreateCommand();
dataQuery.CommandText = TranslateContentToQuery(content);
await dataQuery.ExecuteNonQueryAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
// Do exceptional stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
我DoStuffWithSqlAsync遇到的问题是持续失败,System.InvalidOperationException说明conn处于关闭状态.但是,当我检查堆栈跟踪时,我发现执行仍然在using语句中.我也知道conn在这个操作中的任何地方都没有关闭,因为执行必须返回到语句,并且内部的任何异常应该冒泡到封闭的try-catch并在那里捕获.此外,还连接了连接并启用了MARS.那么,为什么要关闭呢?
更新:有人指出我没有打开我的连接.我已经这样做但错误仍然存在,除非现在_conn.State设置为Open.
更新:我遇到了一个我await conn.OpenAsync.ConfigureAwait(false);不会阻止执行的问题.因此,当我尝试连接到数据库时,我会得到一个异常,说明连接状态已关闭,但到那时它将打开,因此在检查时它会显示Open.有人建议我使调用方法async void但是因为应用程序是控制台,而不是UI我不认为这会有所帮助.我已经恢复使用同步方法.
你只需要打开连接:
try
{
conn.Open() //<--add this
var rw = new SqlReaderWriter(conn);
await DoStuffWithSqlAsync(rw, data).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)