2017-07-18 18 views
-1

爲什麼我在使用Task.RunTask.Start時看到行爲上的差異?Task.Run vs Task.Start

代碼片段:

async Task<string> RunAsync() 
{ 
    await Task.Delay(2); 
    Console.WriteLine("In RunAsync"); 
    return "{}"; 
} 

void Approach1() 
{ 
    var task = new Task(async() => await RunAsync()); 

    task.Start(); 
    task.Wait(); 

    Console.WriteLine("In Approach1"); 
} 

void Approach2() 
{ 
    var task = Task.Run(() => RunAsync()); 

    task.Wait(); 

    Console.WriteLine("In Approach2"); 
} 


void Main() 
{ 
    Approach1(); 
    Approach2(); 
} 

實際輸出:

In Approach1 
In RunAsync 
In RunAsync 
In Approach2 

我期待下面的輸出:

In RunAsync 
In Approach1 
In RunAsync 
In Approach2 

請注意,我所遇到的是意味着對使用任務的博客.Start: https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/

+1

在你提供的兩個例子中,不同的是你調用Task.Run()或Task.Start()。請參閱標記的重複內容,瞭解差異的重要性。簡短版本:在第一個示例中,您沒有提供任何機制來等待實際的RunAsync()工作,因此,在RunAsync()運行之前,您首先訪問_「In Approach1」_輸出。 –

回答

0

在approach1中,您使用await。等待並不等待任何事情。所以你在你的Task中有一個異步的任務,它是異步運行的。然後它會觸發並忘記RunAsync方法,在異步方法仍在運行時結束任務。

+1

通過approach2,你的意思是approach1嗎? – pmohandas

+0

謝謝,編輯修復 –