6

可能重复:
.Net 4.5 中 Async/Await 的简要说明

我已经用 C# 编程了一段时间,但我无法理解新的async / await语言功能是如何工作的。

我写了一个这样的函数:

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()函数,以便它本身可以在另一种方法中等待。这是正确的方法吗?我有点失落。:)

4

3 回答 3

4

我希望您已经yield return了解了创建迭代器的语法。它暂停执行,然后在需要下一个元素时继续执行。你可以想到await做一些非常相似的事情。等待异步结果,然后该方法的其余部分继续。当然,它不会阻塞,因为它正在等待。

于 2013-01-11T18:43:00.493 回答
2

看起来不错,除了我相信这是语法:

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

因为 await 适用于“任务”返回,所以除非函数有任务结果,否则没有返回。

这是来自微软的非常清楚的例子

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";
}
于 2013-01-11T18:28:29.607 回答
0

像这样的东西:

  • tcpClient.ConnectAsync(Config.Hostname, Config.Port)将异步运行;
  • await connectionResult执行后将返回给方法的调用者ConnectAsync
  • 然后await connectionResult将完成它的异步工作,其余的方法将被执行(如回调);

此功能的祖先:

使用 AsyncEnumerator 简化 APM

更多 AsyncEnumerator 功能

于 2013-01-11T18:40:27.627 回答