【问题标题】:Code after 'await Task.Delay(5000)' is not executing until the execution of relaycommand is completed'await Task.Delay(5000)' 之后的代码在 relaycommand 的执行完成之前不会执行
【发布时间】:2019-02-01 03:51:55
【问题描述】:

在我的 WPF 应用程序中,我正在调用 relaycommand

    private void AutoRun(object parameter)
    {
        for(int i=0;i<10;i++)
        {
        MoveLotCommand.Execute(0);

        }

    }

这又调用另一个中继命令

  private void MoveLot(object parameter)
    {
        //Some Code

            var Task = StartLotProcessing(currentAssemblyPlant);

        }
    }

这个中继命令会调用另一个异步函数

    async Task StartLotProcessing(int currentAssemblyPlant)
    {
        await Task.Delay(5000);
        var nextAssemblyPlant = currentAssemblyPlant + 1;

        //Process after await
    }

问题是,'await Task.Delay(5000)' 之后的代码在我的 AutoRun() 函数执行完成之前不会执行。

我正在尝试为我的 for 循环中的每个变量执行等待异步代码。

任何帮助将不胜感激,并对我的解释感到抱歉。

【问题讨论】:

标签: c# wpf mvvm relaycommand


【解决方案1】:

您没有正确调用该方法:您缺少用于指示您必须等待的 await 运算符,否则您可以有效地安排任务但不要等待它。该任务以同步方式安排,因此当您的方法返回时。

把你的电话改成这个,问题应该会消失:

await StartLotProcessing(currentAssemblyPlant);

【讨论】:

    【解决方案2】:

    问题似乎是您正在异步调用StartLotProcessing,但没有等待任务完成后再继续。

    理想情况下,您会在堆栈的整个过程中调用 use async/await:

    await MoveLotCommand.Execute(0);
    ...
    await StartLotProcessing(currentAssemblyPlant);
    

    如果你不能这样做,那么你应该打电话

    var task = StartLotProcessing(currentAssemblyPlant);
    ...
    task.Wait();
    

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2012-06-26
      • 2019-02-22
      • 2016-12-25
      • 2016-08-29
      相关资源
      最近更新 更多