2
비동기 쿼리 실행을 사용하여 MS SQL 서버에서 MySQL 서버로 데이터를 이동할 수있는 앱이 있습니다. 데이터가 잘 움직이지만 Task.WaitAll (작업)은 RunAllTasks() 메서드를 호출하지 않고 완료됩니다.비동기 SQL 쿼리 실행 - Task.WaitAll (tasks)가 완료되지 않음
비동기 작업은 모두 BeginExecuteReader를 통해 MS SQL 호출이 비동기 적으로 호출되는 PumpLocsAsync() 패턴을 따릅니다. 독자가 결과를 반환하면 MySQL은 정상적으로 삽입합니다.
..
async Task PumpLocsAsync()
{
using (var conn = new SqlConnection(SqlConnStr))
using (var cn = new MySqlConnection(MysqlConnStr))
using (var cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "SELECT HERE";
conn.Open();
var handle = cmd.BeginExecuteReader();
await Task.Factory.FromAsync(handle, (ar) =>
{
var rdr = cmd.EndExecuteReader(ar);
var qry = @"INSERT HERE";
cn.Open();
using (var cmdm = new MySqlCommand(qry, cn))
{
cmdm.CommandTimeout = MysqlCmdtimeout;
<PARAM SETUP HERE>
<COLUMN MAPPING HERE>
while (RetryUtility.RetryMethod<bool>(() => rdr.Read(), 3, 1000))
{
<LOADING PARAMS WITH BITS HERE>
RetryUtility.RetryAction(() => cmdm.ExecuteNonQuery(), 3, 1000);
}
}
Console.WriteLine("Finished Locs!");
cn.Close();
});
conn.Close();
}
}
...
void RunAllTasks()
{
Task[] tasks = { PumpLocsAsync(), PumpPicsAsync() };
try
{
Task.WaitAll(tasks);
Console.WriteLine("Finished with all tasks...");
foreach (var task in tasks)
{
Console.WriteLine("Id: {0}, Status: {1}", task.Id, task.Status);
}
}
....
다음과 같은 것이 있습니까? var rdr = Task.Factory.FromAsync (cmd.BeginExecuteReader ( ), (Func) cmd.EndExecuteReader); –
dr3x
이것은 _is_ 대답입니다 ... – MoonKnight
@ dr3x, 네, 맞아요. – svick