gpt4 book ai didi

c# - 异步方法将控制权来回切换到下一个异步方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:39 25 4
gpt4 key购买 nike

我有两个异步方法可以从数据库中的两个表中检索数据。在运行时,我得到一个错误

Collection was modified; enumeration operation may not execute

我进入我的代码并意识到一些奇怪的事情,这两个方法甚至在一个方法完成执行之前来回切换控制。方法 1 将在两三行之后执行,然后在几行控制权返回到方法 1 之后执行方法 2。这种情况会发生,直到我得到该异常。有趣的是,在发布此内容时,我运行了应用程序并且没有出现异常。下面是两种方法

public async void InitializeParts()
{
populator = new Populator();
await Task.Run(()=> detailsDataTable = new DataTable());
string partSql = "SELECT * FROM tblparts";
await Task.Run(() => populator.FillDataTableAsync(partSql, detailsDataTable));
await Task.Run(() => partDetailsDataGridView.DataSource = detailsDataTable);
detailsCriteriaSearchBox.Text = string.Empty;
}

public async void InitializeTrack()
{
populator = new Populator();
await Task.Run(() => trackDataTable = new DataTable());
string TrackSql = "SELECT * FROM tblmodule";
await Task.Run(() => populator.FillDataTableAsync(TrackSql, trackDataTable));
await Task.Run(() => trackModulesDataGridView.DataSource = trackDataTable);
trackCriteriaSearchBox.Text = string.Empty;
}

我这样依次调用这两个方法

await Task.Run(() => InitializeParts());
await Task.Run(() => InitializeTrack());

我的问题是到底发生了什么,因为我想处理它。

最佳答案

public async void InitializeParts()

这是一个不返回 Task 的异步方法,因此无法等待。

await Task.Run(() => InitializeParts());

这会创建一个可以等待的 Task,然后调用上面不能等待的方法。因此,Task 将在启动 InitializeParts() 后返回,但不会在等待 InitializeParts() 完成后返回。 (很可能在 InitializeParts() 中的第一个 await 之后。

public async void InitializeParts() 更改为 public async Task InitializeParts()

此外,当您执行以下操作时:

await Task.Run(() => populator.FillDataTableAsync(partSql, detailsDataTable));

然后您正在创建一个调用另一个任务但不等待它的任务,然后等待那个“外部”任务。这应该只是:

await populator.FillDataTableAsync(partSql, detailsDataTable);

await Task.Run(() => InitializeParts()); 更改为 await InitializeParts();

用另一种方法做同样的事情。

现在您将等待整个任务。

Funny thing though is that while posting this, I ran the application and I got no Exception.

您的问题是您的异步​​代码依赖于它的两部分之间的顺序,而您没有正确地强制执行该顺序。没有什么可说的,它有时不会碰巧以正确的顺序运行,也没有什么可以保证它会。

关于c# - 异步方法将控制权来回切换到下一个异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30477362/

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