gpt4 book ai didi

c# - 异步 SQL 查询执行 - Task.WaitAll(tasks) 永远不会完成

转载 作者:行者123 更新时间:2023-11-30 20:06:01 24 4
gpt4 key购买 nike

我有一个应用程序可以使用异步查询执行将数据从 MS SQL 服务器移动到 MySQL 服务器;数据移动正常,但 RunAllTask​​s() 方法中的 Task.WaitAll(tasks) 调用从未完成。

异步任务都遵循 PumpLocsAsync() 的模式,其中对 MS SQL 的调用是通过 BeginExecuteReader 异步调用的;当读取器返回结果时,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);
}
}

....

最佳答案

您误解了如何调用 Task.Factory.FromAsync(),您将 BeginXxx 方法的结果和 EndXxx< 的委托(delegate)传递给它 方法:

var rdr = await Task.Factory.FromAsync(
cmd.BeginExecuteReader,
(Func<IAsyncResult, SqlDataReader>)cmd.EndExecuteReader,
null);

如果你想在操作完成后做一些事情,只需将它放在这一行下面,await 将确保它在正确的时间执行。

关于c# - 异步 SQL 查询执行 - Task.WaitAll(tasks) 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com