使用Task.Delay()关闭程序



我尝试使用Task.Delay((,但当程序到达那里时,无论发生什么,它都会简单地关闭自己。例如,在这种情况下,程序甚至无法到达Console.Write("*");行,它将关闭。我做错了什么?知道吗?

(示例代码(

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Whatever
{
class Program
{
static async Task WriteAsync()
{
while (true)
{
await Task.Delay(1000);
Console.Write("*");
}
}
static void Main(string[] args)
{
WriteAsync();
}
}
}

Patrick Roberts在Question评论中所说的,使您的主方法异步。

知道发生了什么很有帮助,所以我会试着把它分解开来。

Task.Delay(1000)返回一个任务,该任务必须在某个地方等待(事实确实如此(。

然而,等待Task.Delay(1000)的Task是由WriteAsync返回的,并且主方法没有等待该任务(因此Task.Delay(1000)实际上没有在任何地方等待(。

main方法运行一个返回任务的方法,然后它立即退出,任务的工作本来可以开始,但没有什么(a(等待它完成,所以程序终止,任务未完成。

现在,在主方法中,可以具有WriteAsync().Wait()
但是,由于很多原因,不建议这样做,主要是因为您正在同步调用异步方法,虽然它可以与这个简单的程序一起使用,但它肯定会在程序中引入死锁。

相反,将您的主方法更改为async
在编写异步代码时,需要在下一直保持异步

static async Task Main(string[] args)
{
await WriteAsync();
}

问题因此,如果我主要有许多异步方法,那么至少需要等待其中一个,否则程序将在任务运行之前完成

回答否,必须等待所有任务。

static async Task Main(string[] args)
{
WriteAsync01();
await WriteAsync02();
}    

如果WriteAsync02()WriteAsync01()之前完成,程序将在WriteAsync01()完成之前终止,这不是您想要的。

static async Task Main(string[] args)
{
await WriteAsync01();
await WriteAsync02();
}

这将按顺序等待两个任务,因此WriteAsync01()WriteAsync01()开始之前运行到完成,这可能不是您想要的。

static async Task Main(string[] args)
{
var task1 = WriteAsync01();
var task2 = WriteAsync02();
await task1;
await task2;
}

将启动两个任务,但程序将等待两个任务完成后再终止。或者,这与上述内容相同。

static async Task Main(string[] args)
{
var task1 = WriteAsync01();
var task2 = WriteAsync02();
await Task.WhenAll(task1, task2);
}

由于Main中没有等待WriteAsync(),因此程序在调用异步任务后继续,实际上在任务完成之前完成。

最新更新