gpt4 book ai didi

c# - 当您在 C# 任务等待程序上调用 `OnCompleted()` 时,您如何等待 OnCompleted 调用中给出的新作业?

转载 作者:行者123 更新时间:2023-11-30 14:27:16 38 4
gpt4 key购买 nike

我的 Controller对象使用 Renci.SshNet 通过 SSH 调用 MySQL 数据库,因为我连接到多个数据库,所以我转向多线程,函数 af.FetchAll()返回 DataSet , 所有这些都被添加到列表中 DataList<DataSet> ,然后我要求完成所有任务,然后我会给我 DataList写入器对象将其保存到 CSV 文件,问题是:awaiter.OnCompleted(() =>..etc 中的代码仍在更新 DataList当文件编写器试图访问它时,尽管我要求任务完成 foreach (Task t in taskList) t.Wait(); ,在我继续将“DataList”写入文件之前,我如何确保等待程序完成执行

    public void Query()
{
List<QueryValue> QueriesList = quryValLister.GetQueriesList();
List<ConnectionValues> ConnectionsList = concValLister.GetConnectionList();
// iterating over servers
List<Task> taskList = new List<Task>();
foreach (ConnectionValues obj in ConnectionsList)
{
Controller af = new Controller(obj, QueriesList);
Task<DataSet> taskDataResult = Task.Run (() => af.FetchAll());
taskList.Add(taskDataResult);
var awaiter = taskDataResult.GetAwaiter();
awaiter.OnCompleted(() =>
{
DataSet temp = awaiter.GetResult();
if (temp != null)
{
MyDataList.Add(temp);
}

});
}
foreach (Task t in taskList) t.Wait();
}

最佳答案

您不应在常规代码中使用 GetAwaiter

如果你想异步写这个,你可以这样做:

public Task QueryAsync()
{
List<QueryValue> QueriesList = quryValLister.GetQueriesList();
List<ConnectionValues> ConnectionsList = concValLister.GetConnectionList();
// iterating over servers
var tasks = ConnectionsList
.Select(obj => Task.Run(() => new Controller(obj, QueriesList).FetchAll()));
MyDataList.AddRange(await Task.WhenAll(tasks));
}

或者,如果您想同步编写它:

public void Query()
{
List<QueryValue> QueriesList = quryValLister.GetQueriesList();
List<ConnectionValues> ConnectionsList = concValLister.GetConnectionList();
// iterating over servers
var tasks = ConnectionsList
.Select(obj => Task.Run(() => new Controller(obj, QueriesList).FetchAll()))
.ToArray();
Task.WaitAll(tasks);
foreach (var task in tasks)
MyDataList.Add(task.Result);
}

注意同步版本的错误处理是不同的;异常包含在 AggregateException 中。

关于c# - 当您在 C# 任务等待程序上调用 `OnCompleted()` 时,您如何等待 OnCompleted 调用中给出的新作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33309893/

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