为什么这个程序写一个空行而不是字符串值?
本文关键字:字符串 一个 程序 为什么 | 更新日期: 2023-09-27 18:10:04
当我运行以下代码时(我在c#面试中被问到),它没有输出任何内容。
谁能解释一下这种行为?class Program {
private static string result;
static void Main() {
SaySomething();
Console.WriteLine(result);
}
static async Task<string> SaySomething() {
await Task.Delay(5);
result = "Hello world!";
return “Something”;
}
}
我认为这个方法应该输出result
,因为我调用
Console.WriteLine(result);
在SaySomething()
方法调用完成后
因为SaySomething
是async
,当你点击await Task.Delay(5)
时,它将把线程的控制权交给调用者,从而在它改变result
的值之前点击Console.WriteLine(result)
。把它改成SaySomething().Wait();
就行了
如果您给Task<string>
足够的时间来完成,这个程序将会写一些东西给控制台。但是,目前该程序在SaySomething()
完成之前存在。
要解决这个问题,请确保等待Task<string>
:
static void Main() {
MainAsync().Wait();
}
private static async Task MainAsync() {
var retVal = await SaySomething().ConfigureAwait(false);
Console.WriteLine("{0} - {1}", retVal, result);
}
请注意,当前版本还会忽略异步任务返回的结果。上面的示例将返回值存储在retVal
变量中,并将其与SaySomething
存储在静态变量中的result
一起打印。
您的SaySomething()
方法是async
。您的Console.WriteLine(results)
在任务完成之前被调用。你可以做两件事中的一件。
你可以这样调用函数:
SaySomething().Wait();
或者你可以像这样中断你的进程:
private static string result;
static void Main()
{
CallSaySomething();
Console.WriteLine(result);
Console.ReadLine();
}
static async Task<string> SaySomething()
{
await Task.Delay(5);
result = "Hello world!";
return "Something";
}
static string CallSaySomething()
{
var task = SaySomething();
task.Wait();
var result = task.Result;
return result;
}
您没有等待SaySomething
返回的Task
完成。只要await Task.Delay(5)
运行,SaySomething
就返回到Main
。此时result
还没有设置,所以Console。WriteLine prints an empty string. Then your application ends when
Main exits and the task started in
说某事永远不会完成。
你想要这样:
class Program {
private static string result;
static void Main() {
SaySomething().Wait();
Console.WriteLine(result);
}
static async Task<string> SaySomething() {
await Task.Delay(5);
result = "Hello world!";
return “Something”;
}
}
在正常情况下,你会想要await SaySomething();
而不是阻塞,但Main
不允许是一个异步方法