【问题标题】:C# Task & Await calling my function twiceC# Task 和 Await 调用我的函数两次
【发布时间】:2021-08-24 18:39:15
【问题描述】:

我很少使用 task / await 来调用我的函数。请看一下我的代码示例。我正在使用 .net v4.5.2。

private async void button1_Click(object sender, EventArgs e)
{
     bool retvalue = false;
     var periodTimeSpan = TimeSpan.FromSeconds(10);
     var task1 = SimulateJob(); 
     var task2 = Task.Delay(periodTimeSpan);
     await Task.WhenAll(task1, task2);
     retvalue = (bool) task1.Result;
}

private Task<bool> SimulateJob()
{
     bool status = false;

     Task.Delay(10000);
     status = true;

    return Task.FromResult(status);
}

请运行代码并了解 SimulateJob() 函数会被调用两次。

在我的 SimulateJob() 函数 中,将大的 excel 文件加载到电子表格控件中。如果该函数被调用两次,那对我来说将是个问题。

如何更改我的代码,以便当此行将执行 await Task.WhenAll(task1, task2); 然后我的 SimulateJob() 函数 将是调用。

在实际代码中SimulateJob() 函数 加载多个大的excel 文件。我看到当这条线执行 var task1 = SimulateJob(); 然后我的例程加载所有那些大文件,这是我的问题。我希望当这条线执行await Task.WhenAll(task1, task2); 时,我的 SimulateJob 函数 应该加载那些大的 excel 文件。所以告诉我我需要在我的代码示例中更改什么。

请帮助我处理这种情况。谢谢

【问题讨论】:

  • 它没有被调用两次
  • 你想通过在任务 2 中延迟 10 秒来达到什么目的?你想等待你当前的线程直到你完成你的函数SimulateJob
  • @AbhilashAugustine 是的,我想在 10 秒后执行 SimulateJob() 将被延迟。但是当我逐行调试代码时,我看到 SimulateJob() 调用了两次。
  • 在实际代码中 SimulateJob() 函数加载多个 bug excel 文件。我看到这条线var task1 = SimulateJob(); 然后我的例程加载所有那些大文件,这是我的问题。我希望当这条线执行`await Task.WhenAll(task1, task2);`时,我的 SimulateJob 函数应该加载那些大的 excel 文件。所以告诉我我需要改变什么。谢谢
  • 要清楚——awaitWhenAll 都不负责启动任何事情。你给他们已经在运行Tasks,他们会等待他们完成。听起来像你的 SimulateJob 方法,尽管返回 Task 实际上是同步的。

标签: c#


【解决方案1】:
private async void button1_Click(object sender, EventArgs e)
        {
            bool retvalue = await SimulateJob();
            Console.WriteLine(retvalue); // this line of code will execute after excel file loaded
        }

    private async Task<bool> SimulateJob()
    {
        bool status = false;

        await Task.Delay(10000); // call your asynchronus excel loading here
        status = true; // once it's done,  then set status to true

        return status;
    }

这是您可以从按钮单击处理程序调用异步函数的方式。无需注册不需要的任务只需延迟 10 秒。

在你的异步函数定义中使用关键字async,就像上面一样。

【讨论】:

  • 好的,谢谢,我会按照你的方法。如果出现任何问题,我会通知您。谢谢
  • 假设您可以在 SimulateJob() 中等待某些内容。你可以Task.Run()它。
  • 我不能使用 Task.Run() 因为我使用的是 devexpress 电子表格控件并且它不支持线程。
  • 当然可以。当您await Task.Run(()=&gt; SomeMethod()) 时,继续在 UI 线程中恢复。这是同一件事。我希望您不要尝试以异步方法访问 Control,这没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2020-05-18
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多