【发布时间】: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 answer、this question 等等。
标签: c# asynchronous methods parallel-processing task