Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Task.Delay()关闭程序_C#_Asynchronous_Async Await - Fatal编程技术网

C# 使用Task.Delay()关闭程序

C# 使用Task.Delay()关闭程序,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我尝试使用Task.Delay(),但当程序到达那里时,不管发生什么,它都会自动关闭。例如,在这种情况下,程序甚至无法到达控制台行,它关闭。我做错了什么?有什么想法吗 (示例代码) 由于WriteAsync()未在Main中等待,因此程序在调用异步任务后继续运行,并在任务完成之前实际完成。Patrick Roberts在问题注释中所说的,将主方法设为异步 知道发生了什么很有帮助,所以我试着把它分解一下 Task.Delay(1000)返回一个任务,该任务必须在某个地方等待(它确实在等待) 但是,

我尝试使用Task.Delay(),但当程序到达那里时,不管发生什么,它都会自动关闭。例如,在这种情况下,程序甚至无法到达
控制台行,它关闭。我做错了什么?有什么想法吗

(示例代码)


由于
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,吹毛求疵:)