如何异步和延迟并行运行多个方法

时间:2019-06-24 12:06:59

标签: c# asynchronous methods parallel-processing task

我正在尝试并行运行两个方法。第一种方法连接到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;
        }
    }
}

我期望以下输出以及之间的相应暂停: 10秒 10秒 10秒 30秒 10秒 10秒 10秒 30秒 ...

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

感谢您的帮助和提示。

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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