2013-01-11 64 views
6

可能重複:
Brief explanation of Async/Await in .Net 4.5C#5異步/等待最簡單的說明

我在C#中被編程有一段時間了,但我不能讓我圍繞如何頭新的異步/等待語言功能的作品。

我寫了這樣的功能:

public async Task<SocketError> ConnectAsync() { 
    if (tcpClient == null) CreateTCPClient(); 
    if (tcpClient.Connected) 
     throw new InvalidOperationException("Can not connect client: IRCConnection already established!"); 

    try { 
     Task connectionResult = tcpClient.ConnectAsync(Config.Hostname, Config.Port); 
     await connectionResult; 
    } 
    catch (SocketException ex) { 
     return ex.SocketErrorCode; 
    } 

    return SocketError.Success; 
} 

但顯然,沒有點到這一點,對不對?因爲我正在等待緊接着的行上的TcpClient.ConnectAsync的結果。

但我想寫我的ConnectAsync()函數,以便它本身可以用另一種方法等待。這是正確的方法嗎?我有點失落。

await tcpClient.ConnectAsync(Config.Hostname, Config.Port); 

因爲等待的「任務」迴歸工程沒有返回,除非函數有一個任務結果::)

+1

如果你想有一個只有成功/失敗的「異步」方法(沒有「結果」值),然後返回「任務」而不是「任務」。在.NET中返回錯誤代碼不是正常的做法。 –

+0

Stephen:我實際上想返回SocketError(如果有的話),或者SocketError.Success(如果沒有的話)。然而,你是否認爲只是讓任何SocketException被傳播給調用者會更好? – Xenoprimate

+0

@Migig是的,這就是他所說的。 – Servy

回答

4

我希望你所遇到的yield return語法來創建一個迭代器。它暫停執行,然後在需要下一個元素時繼續。你可以想到await做一些非常相似的事情。等待異步結果,然後該方法的其餘部分繼續。當然,它不會被阻擋,因爲它會等待。

+0

是的,我有。按照我理解的方式,收益回報只會根據需要返回集合中的元素。那麼你是否說tcpClient.ConnectAsync()方法不會阻塞,直到從程序的另一個區域訪問tcpClient上的某個字段? – Xenoprimate

+0

@Motig - 在這種情況下,直到異步操作的結果可用。 – manojlds

2

除了我相信這是語法似乎不錯。

這裏是microsoft

private async void button1_Click(object sender, EventArgs e) 
{ 
    // Call the method that runs asynchronously. 
    string result = await WaitAsynchronouslyAsync(); 

    // Call the method that runs synchronously. 
    //string result = await WaitSynchronously(); 

    // Display the result. 
    textBox1.Text += result; 
} 

// The following method runs asynchronously. The UI thread is not 
// blocked during the delay. You can move or resize the Form1 window 
// while Task.Delay is running. 
public async Task<string> WaitAsynchronouslyAsync() 
{ 
    await Task.Delay(10000); 
    return "Finished"; 
} 

// The following method runs synchronously, despite the use of async. 
// You cannot move or resize the Form1 window while Thread.Sleep 
// is running because the UI thread is blocked. 
public async Task<string> WaitSynchronously() 
{ 
    // Add a using directive for System.Threading. 
    Thread.Sleep(10000); 
    return "Finished"; 
} 
0

這樣的事情很明顯的例子:

  • tcpClient.ConnectAsync(Config.Hostname, Config.Port)將異步運行;
  • await connectionResult之後執行將回調到ConnectAsync方法的調用者;
  • 然後await connectionResult將完成它的異步工作,你的方法的其餘部分將被執行(如回調);

祖先此功能:

Simplified APM with the AsyncEnumerator

More AsyncEnumerator Features