为什么这个程序写一个空行而不是一个字符串值?

时间:2015-08-27 19:03:01

标签: c# async-await

当我运行以下代码时(在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()方法调用后

4 个答案:

答案 0 :(得分:2)

因为SaySomethingasync,当您点击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不允许是异步方法。