2017-04-14 96 views
0

该程序不会按正确的顺序打印输出。异步和等待C#和问题

public static void Main(string[] args) 
    { 
     new Program().Start(); 
    } 

    public async void Start() 
    { 
     int num1 = await GetNumber(); 
     int num2 = await GetNumber(); 
     int num3 = await GetNumber(); 
     Console.WriteLine("Wait..."); 
     Console.ReadKey(); 
    } 

    public static async Task<int> GetNumber() 
    { 
     System.Threading.Thread.Sleep(4000); 
     Console.WriteLine("Hello"); 
     return 0; 
    } 

它输出:

--------wait 4Seconds 
--------print Hello 
--------wait 4Seconds 
--------print Hello 
--------wait 4Seconds 
--------print Hello 
--------print wait.... 

它应该输出

--------print wait.... 
--------wait 4Seconds 
--------print Hello 
--------print Hello 
--------print Hello 
+3

你在GetNumber之前使用await关键字,我认为它会等待操作,并且在前一个没有完成的时候没有移动光标到下一个命令。 –

回答

1

await的意思是“打破这里一半的方法,回来后,当这个调用完成”。这就是你如何将Task<T>“转换”为T:通过等待(等待)任务。否则,你会被卡住Task<T>

好像你正在寻找的却是等待任务,使它们异步运行,但如果你这样做,那么你将无法得到int结果。

(由于对方的回答中提到,您还需要await东西GetNumber或不会实际上是异步的。)

喜欢的东西:

public static void Main(string[] args) { 
    new Program().Start(); 
} 

public void Start() { 
    GetNumber(); 
    GetNumber(); 
    GetNumber(); 
    Console.WriteLine("Wait..."); 
    Console.ReadKey(); 
} 

public static async Task<int> GetNumber() { 
    await Task.Delay(TimeSpan.FromSeconds(1)); 
    Console.WriteLine("Hello"); 
    return 0; 
} 

应该给输出你期望:

稍候...
你好
你好
你好

8

使用

Await Task.Delay(Timespan.FromMilliSeconds (4000)) 

代替了Thread.Sleep。

完全成功的例子。

using System; 
using System.Threading.Tasks; 

namespace Brad 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var task = new Program().Start(); 
      Console.WriteLine("Wait..."); 
      // You have to put a synchronous Wait() here because 
      // Main cannot be declared as async 
      task.Wait(); 
     } 

     public async Task Start() 
     { 
      int num1 = await GetNumber(); 
      int num2 = await GetNumber(); 
      int num3 = await GetNumber(); 
      Console.WriteLine("Finished"); 
     } 

     public static async Task<int> GetNumber() 
     { 
      await Task.Delay(TimeSpan.FromMilliseconds(400)); 
      Console.WriteLine("Hello"); 
      return 0; 
     } 
    } 
} 

你可以看到在这里运行

https://dotnetfiddle.net/KHJaDZ

或者你想在并行,而不是一个接一个运行的任务。你可以尝试

using System; 
using System.Threading.Tasks; 

namespace Brad 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var task = new Program().Start(); 
      Console.WriteLine("Wait..."); 
      // You have to put a synchronous Wait() here because 
      // Main cannot be declared as async 
      task.Wait(); 
     } 

     public async Task Start() 
     { 
      var task1 = GetNumber(); 
      var task2 = GetNumber(); 
      var task3 = GetNumber(); 
      // This runs the tasks in parallel 
      await Task.WhenAll(task1, task2, task3); 
      Console.WriteLine("Finished"); 
     } 

     public static async Task<int> GetNumber() 
     { 
      await Task.Delay(TimeSpan.FromMilliseconds(400)); 
      Console.WriteLine("Hello"); 
      return 0; 
     } 
    } 
} 

这是在这里运行。

https://dotnetfiddle.net/kVk77Z

+0

当我使用它时,我的应用程序关闭了 public static void Main(string [] args) { {0}新的Program()。开始(); () } public async void开始() { int num1 = await GetNumber(); int num2 = await GetNumber(); int num3 = await GetNumber(); Console.WriteLine(“Wait ...”); Console.ReadKey(); } public static async任务 GetNumber() await Task.Delay(TimeSpan.FromMilliseconds(1000)); Console.WriteLine(“Hello”); return 0; } –

+0

我写过你现在两个版本的同一个程序。一个串行运行任务,另一个并行运行任务。他们都经过测试,应该会帮助你理解。 :) – bradgonesurfing