c# - 等待方法何时退出程序?
问题描述
我一直在阅读以下帖子,特别是这一点:
在您的应用程序的入口点方法上,例如 Main。当您等待尚未完成的实例时,执行将返回到方法的调用者。在 Main 的情况下,这将从 Main 中返回,从而有效地结束程序。
我一直在尝试这样做,但我似乎无法让它退出。这是我的代码:
class Program
{
// ending main!!!
static async Task Main(string[] args)
{
Task<Task<string>> t = new Task<Task<string>>(async () =>
{
Console.WriteLine("Synchronous");
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Synchronous");
Console.WriteLine("Synchronous I is: " + i);
await Task.Run(() => { Console.WriteLine("Asynchronous"); });
await Task.Run(() => { for (int j = 0; j < 1000; j++) { Console.WriteLine( "Asynchronous, program should have exited by now?"); }});
}
return "ASD";
});
t.Start();
await t;
}
}
我到底在这里想念什么?程序不应该在命中该行await t;
或跟随线程时退出await Task.Run(() => { Console.WriteLine("Asynchronous"); });
吗?
这是控制台应用程序的主要方法。
解决方案
您链接的文章来自 2012 年,该文章早于向 Main() 添加异步支持,这就是为什么它所谈论的内容似乎是错误的。
对于当前的实现,请考虑以下代码:
public static async Task Main()
{
Console.WriteLine("Awaiting");
await Task.Delay(2000);
Console.WriteLine("Awaited");
}
这由编译器转换如下(我使用“JustDecompile”来反编译它):
private static void <Main>()
{
Program.Main().GetAwaiter().GetResult();
}
public static async Task Main()
{
Console.WriteLine("Awaiting");
await Task.Delay(2000);
Console.WriteLine("Awaited");
}
现在您可以看到程序不退出的原因。
在async Task Main()
程序退出之前static void <Main>()
等待Task
返回的 fromasync Task Main()
完成(通过访问)。.GetResult()
推荐阅读
- java - notifyItemChanged(int) 不更新 RecyclerView.Adapter
- javascript - 在输入日期内获取值
- r - 如何对保留总和大于 0 的列和行的矩阵进行子集化?
- php - Symfony 4 DateTimeType 显示 2014 年的日期时间选项,如何更改它?
- python - 将数据框转换为日期格式
- javascript - 如何访问显示为无的元素属性?
- python - Lambda 层未正确传递掩码
- javascript - redux 表单元素类型无效:应为字符串(用于内置组件)
- leaflet - 图层控件中的图层标记
- java - 使用 UnicastReceivingChannelAdapter 处理 UDP 以创建发布-订阅通道