【问题标题】:How to run multiple methods asynchron and in parallel with delay如何运行多个方法异步和延迟并行
【发布时间】:2019-06-24 12:06:59
【问题描述】:

我正在尝试并行运行两种方法。第一种方法连接到 ftp 服务器并下载一些数据。因为我想减少网络流量,所以它应该每 30 秒运行一次。 同时,我希望另一种方法每 10 秒独立于第一种方法运行。

问题是我没有让方法并行运行/延迟。

namespace Example
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await Task.Run(async () =>
            {
                while (true)
                {
                    await Every10s();
                    await Every30s();
                }
            });
        }

        public static async Task<bool> Every10s()
        {
            await Task.Delay(10000);
            Console.Writeline("10s");
            return true;
        }

        public static async Task<bool> Every30s()
        {
            await Task.Delay(30000);            
            Console.Writeline("30s");
            return true;
        }
    }
}

我希望以下输出带有相应的停顿: 10s 10s 10s 30 多岁 10s 10s 10s 30 多岁 ...

但相反,这两种方法相互等待,所以我得到输出 10s 30s 10s 30s 10s 30s 和 40s 的暂停。

感谢任何帮助和提示。

【问题讨论】:

  • 您应该将它们存储在一个列表中并在其上执行await Task.WhenAll(list),而不是等待方法返回。您需要在每个 while 循环中执行此操作。请注意,对于这个用例,我建议在 async/await 上使用计时器,因为这实际上是计时器的定义。在这里不使用 async/await 的另一个原因是因为 async/await 并不是真正的并行(我会在这里链接到一篇很棒的文章,但我忘记了它来自哪里)。
  • 您混淆了并行执行和异步执行。异步不是并行的。
  • @iSpain17 非常正确,忘记提及了。我会添加它。
  • 这个程序将如何结束?没有办法退出无限循环!
  • 我忘记了这篇文章的出处,但是如果你搜索一下,这里有很多来源,比如this answerthis question 等等。

标签: c# asynchronous methods parallel-processing task


【解决方案1】:

因为我想减少网络流量,所以它应该每 30 秒运行一次。同时,我希望另一种方法每 10 秒独立于第一种方法运行。

您有 两个 独立的工作循环,因此您的代码中需要两个循环:

async Task RunEvery10s()
{
  while (true)
    await Every10s();
}

async Task RunEvery30s()
{
  while (true)
    await Every30s();
}

await Task.WhenAll(RunEvery10s(), RunEvery30s());

【讨论】:

  • 这个程序何时以及如何终止?
  • 它会在所有前台线程都退出后退出,就像任何其他程序一样。
  • 但是对Task.WhenAll 的调用永远不会返回,对吧?传入的任务都不会完成,因此Task.WhenAll 调用也不会返回,或者我错过了什么?
  • WhenAll 是一种观察异常的方法。如果其中任何一个操作失败,它们的异常最终会从await Task.WhenAll 抛出。
  • 谢谢!我之前尝试过,但没有 await methodname();工作正常。我已经实施了取消例外;代码只是一个简化的例子。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多