等待完成异步 lambda 表达式中的所有异步方法

Arunprasanth KV

我有一个像下面这样的方法

internal static ProgressDialogResult Execute(Window owner, string label, Action operation, ProgressDialogSettings settings)
{
    return ExecuteInternal(owner, label, (object)operation, settings);
}

用于显示基于任务完成的进度条。我正在调用上面的方法,如下所示

int count = soilData.Count;

var result = ProgressDialog.Execute(this, "Loading data", async () => {
      for (int i = 1; i <= count; i = i + 1000)
      {
         await soilDataMigration.MigrateSoilData(soilData.GetRange(i, i + 1000 >= count ? count - i : 1000));    
      }
   }, ProgressDialogSettings.WithSubLabel);

if (result.OperationFailed)
   MessageBox.Show("Soil data upload failed failed.");
else
   MessageBox.Show("Soil data successfully executed.");
soilData.Clear();

但是当我尝试执行它时,它突然从 lambda 中出来并开始执行 if 语句。但是我的预期行为是只有当我的所有异步操作在 loop 内完成时,控制才会离开这个 lambda。

我已经在 stackoverflow 中检查了这个问题有没有办法同步运行 async lambda?

但不幸的是,该软件包与 .net 版本 4.5.2 不兼容

有人可以帮我解决这个问题吗?

扎茨曼

实际上,您有两种选择:1)重构所有调用以使其async..await兼容,例如

internal static async System.Threading.Task<ProgressDialogResult> Execute(Window owner, string label, Func<System.Threading.Task> operation, ProgressDialogSettings settings)
{
    return await ExecuteInternal(owner, label, (object)operation, settings);
}

internal static async System.Threading.Task<ProgressDialogResult> ExecuteInternal(Window owner, string label, Func<System.Threading.Task> operation, ProgressDialogSettings settings)
{
    // do whatever
    await operation();
    return //whatever;
}

然后像这样消费它:

int count = soilData.Count;

var result = await ProgressDialog.Execute(this, "Loading data", async () => {
      for (int i = 1; i <= count; i = i + 1000)
      {
         await soilDataMigration.MigrateSoilData(soilData.GetRange(i, i + 1000 >= count ? count - i : 1000));    
      }
   }, ProgressDialogSettings.WithSubLabel);

if (result.OperationFailed)
   MessageBox.Show("Soil data upload failed failed.");
else
   MessageBox.Show("Soil data successfully executed.");
soilData.Clear();

和 2) 只需将await您传递方法更改soilDataMigration.MigrateSoilData(soilData.GetRange(i, i + 1000 >= count ? count - i : 1000)).GetAwaiter().GetResult();

一般来说,选项 1) 更好,因为它清楚地表示意图并协调您拥有的代码。选项 2) 更像是一种解决方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使Lambda函数等待异步操作完成?

来自分类Dev

具有异步lambda的Parallel.ForEach等待所有迭代完成

来自分类Dev

当等待位于传递给异步 lambda 表达式的函数中时,异步方法缺少等待运算符警告

来自分类Dev

等待异步方法完成

来自分类Dev

等待完成异步方法

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步功能完成

来自分类Dev

等待异步下载完成

来自分类Dev

再次在lambda中异步等待

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

如何等待所有异步完成?

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

使用lambda表达式而不是Write方法的异步版本

来自分类Dev

带参数的异步lambda表达式

来自分类Dev

异步void Lambda表达式

来自分类Dev

Xunit Assert中的异步Lambda表达式

来自分类Dev

Xunit Assert中的异步Lambda表达式

来自分类Dev

使异步收集等待所有任务完成

来自分类Dev

异步代码,无需等待完成

来自分类Dev

等待异步HTTP请求完成

来自分类Dev

等待任务完成异步httpwebrequest

来自分类Dev

等待异步执行的块完成

来自分类Dev

异步等待不等待函数完成

来自分类Dev

AngularJS等待foreach中的所有异步调用完成

来自分类Dev

你如何等待所有异步调用在Java中完成?

来自分类Dev

等待异步方法中已完成的任务

来自分类Dev

如何等待 lambda 表达式完成