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 は "Task" の戻り値で機能するため、関数に Task の結果がない限り、戻り値はありません。

これはマイクロソフトの非常に明確な例です

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 に答える