【问题标题】:C# Winform: Long running operation with async await [closed]C# Winform:使用异步等待的长时间运行操作 [关闭]
【发布时间】:2017-02-20 11:06:18
【问题描述】:

我的代码编译正确,但收到警告

此异步方法缺少“等待”运算符,将同步运行。 考虑使用 'await' 运算符来等待非阻塞 API 调用, 或 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。

    private async void Form1_Load(object sender, EventArgs e)
    {
       //await longRunningRoutine();

       await Task.Run(async () =>
       {
           await longRunningRoutine(); ;
       });
       label1.Text = "hello test";

    }

    public async Task longRunningRoutine()
    {
        await Task.Delay(10000);
    }

那么请告诉我我收到警告的代码中缺少什么? 如何解决这个问题。谢谢

【问题讨论】:

  • longRunningRoutine() 究竟做了什么?
  • await Task.Delay(10000);替换睡眠
  • 您的异步方法(longRunningRoutine)缺少等待操作符,将同步运行...
  • 我更新了代码,现在一切正常。谢谢
  • 你的真实代码真的有Task.Delay()吗?如果不是,那么当您尝试将此代码转换为其他代码(不可等待)时,您将遇到同样的问题......但无论如何您已经通过使用 await Task.Run() 解决了它。

标签: c# winforms asynchronous


【解决方案1】:

如果您没有可等待的方法来等待(您没有),则必须创建一个 Task 来运行它,并等待该任务:

private async void Form1_Load(object sender, EventArgs e)
{
     await Task.Run(() => longRunningRoutine())
}

public void longRunningRoutine()
{
    System.Threading.Thread.Sleep(10000);
}

【讨论】:

    【解决方案2】:

    警告说您正在异步调用longRunningRoutine,但此方法没有任何类型的异步请求。
    要解决这个警告你需要同步调用这个方法或者你需要使用Task.Delay异步调用睡眠。

    【讨论】:

    • 我想 OP 实际上对调用 Sleep() 并不感兴趣 - 他只是用它来模拟需要一些时间的同步操作。
    • 我同意你的看法(出于这个原因,我赞成你的回答)但是因为他问他为什么会收到这个错误,所以我只是写了一个解释和两种可能的解决方法(第三个已经发布由你)。
    【解决方案3】:

    您的 longRunningRoutine 方法已经是异步的 - 因此您可以删除只会浪费额外线程的 Task.Run

    private async void Form1_Load(object sender, EventArgs e)
    {
       await longRunningRoutine();
       label1.Text = "hello test";
    }
    

    然后按照约定建议通过添加..Async 后缀来重命名方法 - 这将在您阅读代码时节省几秒钟的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 2021-12-20
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2012-12-15
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多