【发布时间】:2015-12-19 21:06:41
【问题描述】:
我有一个while-loop,它应该重复程序直到满足某个条件。在这个循环中,我调用了一个async 函数,它会为我打印一条消息。这是(短)代码:
private void InitializeMessageSystem ( )
{
do
{
// Do stuff
await printMessage ("Hello World!");
Console.ReadKey();
} while (condition != true)
}
这里是函数PrintMessage():
private static async Task PrintMessage (string message, int spd = 1)
{
int delay = 50 / spd;
string[] words = message.Split(' ');
int index = 1;
for (int word = 0; word < words.Length; word++)
{
char[] current = words[word].ToCharArray();
if (index + current.Length > Console.WindowWidth)
{
Console.WriteLine();
index = 1;
}
for (int c = 0; c < current.Length; c++)
{
Console.Write(current[c]);
await Task.Delay(delay);
}
Console.Write(" ");
}
}
编辑:这是来自主函数的调用:
static void Main (string[] args)
{
InitializeMessageSystem();
Console.ReadKey();
}
问题
为什么我的程序在功能尚未完成的情况下按了一个键会退出?我以为程序会等待Console.ReadKey(),直到函数PrintMessage()完成?
【问题讨论】:
-
你的程序的入口点在哪里?由于 Main 不能是异步的,因此您显示的代码是另一种方法。很有可能,主线程进入该方法,等待等待并在另一个线程上恢复。该线程是被 ReadKey 阻止的线程。主线程继续并退出导致程序退出。
-
@mike z 入口点只有一行代码,循环所在函数的调用
-
@IanH。然而,其中的细节是高度相关的,即使它只是一行代码。
-
@Ian H.:正如上面所暗示的,缺少的几行(主要方法+“循环”方法的签名)是解释您的“奥秘”的关键。请张贴。提出问题时,不要只显示您认为问题所在的代码。通常,这种假设是错误的,这就是为什么首先提出这个问题的原因。相反,请始终提供一个最小但完整的程序,以便我们重现您的问题。如此简单,却又如此有效地获得任何问题的正确答案。
标签: c# async-await