c# - 使用 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();
}
}
}
解决方案
帕特里克罗伯茨在问题评论中所说的,使您的主要方法异步。
知道发生了什么很有帮助,所以我会尝试分解它。
Task.Delay(1000)
返回一个任务,并且该任务必须在某处等待(确实如此)。
然而,等待的任务Task.Delay(1000)
被返回WriteAsync
并且主要方法没有等待该任务(Task.Delay(1000)
因此实际上并没有在任何地方等待)。
main 方法运行一个返回任务的方法,然后 - 立即 - 它退出,任务的工作可能已经开始,但没有任何东西(a)等待它完成,所以程序终止,任务未完成。
现在在你可以拥有的主要方法中WriteAsync().Wait()
。
但是,由于很多原因,不建议这样做,但主要是因为您正在同步调用异步方法,虽然它可以与这个简单的程序一起使用,但它确实是在您的程序中引入死锁的可靠方法。
相反,将您的主要方法更改为异步。
写异步代码的时候,需要一直异步
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);
}
推荐阅读
- javascript - 选择选项默认值加载时不显示,选择其他选项时不显示
- sas - 将宏变量名称作为值
- reactjs - 使用反应延迟加载时在 Edge 上出现 SCRIPT1028 错误
- python - 根据列表过滤熊猫数据框以丢弃
- javascript - 如果没有可显示的内容,隐藏 AJAX 附加?
- scala - 传递依赖没有被拉入 build.sbt
- django - 是否可以访问在我的本地主机上运行的 Django 应用程序以供其他网络上的另一台计算机访问?
- regex - The passing of a string (incl. regex parameters) to a block of code
- jmeter-5.0 - 如何在 Json 中获取值,其中键具有另一个有效负载形式的值
- html - 每当浏览器尺寸减小和使用 CSS / JSS 数据溢出时,在 HTML 的 div 标签上启用滚动条