当我运行以下代码时(在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()
方法调用后
答案 0 :(得分:2)
因为SaySomething
是async
,当您点击await Task.Delay(5)
并因此在Console.WriteLine(result)
更改result
之前,它将控制线程给调用者{1}}。只需将其更改为SaySomething().Wait();
即可。
答案 1 :(得分:1)
如果您已经给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
变量中,并将其与result
中存储的SaySomething
一起打印在静态变量中。
答案 2 :(得分:1)
您的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;
}
答案 3 :(得分:0)
您没有等待Task
返回的SaySomething
完成。只要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
SaySomething`永远不会完成。
你想要这个:
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
不允许是异步方法。