5

新しい非同期CTPビットで遊んでいますが、サーバー側またはコマンドラインプログラムだけで動作させることはできません(すべての例はWPFまたはSilverlightです)。たとえば、次のような簡単なコードです。

class Program {
    static void Main() {
        Program p = new Program();
        var s = p.Ten2SevenAsync();
        Console.WriteLine(s);
    }

    private async Task<int> Ten2SevenAsync() {
        await TaskEx.Delay(10000);
        return 7;
    }
}

すぐに戻りSystem.Threading.Tasks.Task、10秒待って7を返す代わりに1 [System.Int32] `を出力します(私が期待するように)。私が行方不明になっていることは明らかなことであるに違いありません。

4

3 に答える 3

11

awaitベースのコードの要点は、「これが終了したときに次の処理を実行する」(コールバック)ことであり、「これが終了するまで現在のスレッドをブロックする」ことではないということです。

そのため、タスクTen2SevenAsyncを取り戻すことができますが、そのタスクはまだ完了していません。タスクをコンソールに書き込んでも、タスクが完了するのを待つわけではありません。タスクの完了をブロックする場合:

static void Main() {
    Program p = new Program();
    var s = p.Ten2SevenAsync();
    Console.WriteLine(s.Result);
}

またはより明示的に:

static void Main() {
    Program p = new Program();
    var s = p.Ten2SevenAsync();
    s.Wait();
    Console.WriteLine(s.Result);
}
于 2011-05-31T05:59:32.230 に答える
2

例の4行目を次のように変更する必要があると思います。

var s = await p.Ten2SevenAsync();
于 2011-05-31T05:43:30.393 に答える
1

s非同期タスクへの参照です。まだ自分で遊んだことがないので構文はわかりませsんが、タスクが完了したかどうかを確認して結果を取得できるメンバーがいます。

于 2011-05-31T05:44:58.890 に答える