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

本文关键字:字符串 一个 程序 为什么 | 更新日期: 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()方法调用完成后

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

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