C# 使用Task.Delay()关闭程序
我尝试使用Task.Delay(),但当程序到达那里时,不管发生什么,它都会自动关闭。例如,在这种情况下,程序甚至无法到达C# 使用Task.Delay()关闭程序,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我尝试使用Task.Delay(),但当程序到达那里时,不管发生什么,它都会自动关闭。例如,在这种情况下,程序甚至无法到达控制台行,它关闭。我做错了什么?有什么想法吗 (示例代码) 由于WriteAsync()未在Main中等待,因此程序在调用异步任务后继续运行,并在任务完成之前实际完成。Patrick Roberts在问题注释中所说的,将主方法设为异步 知道发生了什么很有帮助,所以我试着把它分解一下 Task.Delay(1000)返回一个任务,该任务必须在某个地方等待(它确实在等待) 但是,
控制台代码>行,它关闭。我做错了什么?有什么想法吗
(示例代码)
由于WriteAsync()
未在Main
中等待,因此程序在调用异步任务后继续运行,并在任务完成之前实际完成。Patrick Roberts在问题注释中所说的,将主方法设为异步
知道发生了什么很有帮助,所以我试着把它分解一下
Task.Delay(1000)
返回一个任务,该任务必须在某个地方等待(它确实在等待)
但是,等待Task.Delay(1000)
的任务由WriteAsync
返回,并且主方法没有等待该任务(因此Task.Delay(1000)
实际上没有在任何地方等待)
main方法运行一个方法,该方法返回一个任务,然后它立即退出,任务的工作可能已经开始,但没有任何东西等待它完成,因此程序终止时该任务尚未完成
现在在main方法中,您可以使用WriteAsync().Wait()
但是,由于很多原因,不建议这样做,主要是因为您正在同步调用异步方法,虽然它可以与这个简单的程序一起工作,但它肯定会在程序中引入死锁
相反,将主方法更改为异步。
在编写异步代码时,需要
问题因此,如果我主要有许多异步方法,那么至少需要等待其中一个,否则程序将在任务运行之前完成
回答否,所有任务都需要等待
static async Task Main(string[] args)
{
WriteAsync01();
await WriteAsync02();
}
如果WriteAsync02()
在WriteAsync01()
之前完成,程序将在WriteAsync01()
完成之前终止,这不是您想要的
static async Task Main(string[] args)
{
await WriteAsync01();
await WriteAsync02();
}
static async Task Main(string[] args)
{
var task1 = WriteAsync01();
var task2 = WriteAsync02();
await task1;
await task2;
}
这将按顺序等待两个任务,因此WriteAsync01()
在WriteAsync01()
启动之前运行到完成,这可能不是您想要的
static async Task Main(string[] args)
{
await WriteAsync01();
await WriteAsync02();
}
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);
}
将其更改为static async void Main(string[]args)
并使用wait WriteAsync()我不想使用await WriteAsync()代码>,因为它是一个无限循环,我希望它与其他异步方法同时运行。然后编写其他异步方法。如果Main
在事件循环中没有任何要恢复执行的挂起任务,它将立即退出。我明白了!非常感谢。因此,如果我主要有许多异步方法,那么至少需要等待其中一个,否则程序将在任务运行之前完成。不,它们都需要等待。您希望程序运行到所有任务完成为止。我会更新我的答案。吹毛求疵,最后两个街区不一样。例如,如果task2
出现异常故障,则第一个块在task1
完成后才会退出,但第二个块将在task2
出现故障时立即退出。@PatrickRoberts,吹毛求疵:)