2016-05-22 89 views
0

我不明白的是下面的代碼片段from MSDN從調用者的角度來看,如何調用與調用同步方法不同的異步方法?

注意,這個方法現在標有新的異步關鍵字;這是 僅僅是編譯器的一個指示器,它讓它知道在該方法的 上下文中,關鍵字await將被視爲點 ,其中工作流將控制權返回給其調用方,並在關聯任務時再次提取 完成。

與非async方法的工作方式有何不同?

如果我

int x; 
x = SomeNormalFunctionThatReturnsAnInt(); 
Console.WriteLine(x); 

int x; 
Task<int> task = SomeAsyncFunctionThatReturnsAnInt(); 
x = await task; 
Console.WriteLine(x); 

然後從呼叫者的角度看,執行的順序是完全相同:一個int名爲x定義,運行返回int的函數,並且當該函數完成運行時,其返回值設置爲x,然後寫入控制檯。

回答

2

從調用者的角度來看,執行的順序是完全相同

是和否。

如果您將await所有任務儘快返回給您,然後,則該方法在隔離時會看到相同的「執行順序」。這實際上是整個async/await - 它允許以非常自然的方式編寫大多數異步代碼,並且與同等代碼類似。

但是,調用者必須意識到它必須是異步的。也就是說,來電者通常使用await,這意味着它必須是async。還有一些額外的麻煩來自異步代碼。舉一個例子:如果這是在UI線程上執行的,則同步代碼知道在SomeNormalFunctionThatReturnsAnIntConsole.WriteLine之間的UI線程上沒有其他東西可以執行;但是,異步代碼使用await,因此它必須接受任何其他內容都可以在SomeAsyncFunctionThatReturnsAnIntConsole.WriteLine之間的UI線程上執行。所以,從這個背景來看,它是不完全相同;異步方法可能會在其他代碼運行時暫停其「執行順序」。

0

如果您未等待函數x的結果可能未初始化。但是在這裏你等待它,所以沒有任何區別。

0

你需要有異步和同步一些讀看到在性能水平發生了什麼,

在你的榜樣,你說的方法在AWAIT的排隊等候,但讓有結果沒有什麼不同看看下面的代碼片段

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」; 
    } 
} 

你可以試着計算輸出,結果不算什麼,爲什麼?

與我們讓主要任務繼續,因爲我們在返回結果前等待5毫秒的await,看看

https://msdn.microsoft.com/en-gb/library/mt674882.aspx

+0

Task.Delay需要幾毫秒而不是幾秒鐘,如果你想等待5秒鐘,這將是Task.Delay(5000) –