14

非同期にしたい通常のメソッドがある場合:

public int Foo(){}

私はします:

public Task<int> FooAsync(){
    return Task.Run(() => Foo());
}

なぜ私はしますか:

public async Task<int> FooAsync(){
    return await Task.Run(() => Foo());
}

これを使用する方法は次のとおりです。

FooAsync().ContinueWith((res) => {});

メソッドを停止せずに実行したいのですが、コールバックのようなものを起動したいので、ContinueWith。しかし、2番目のバージョンでは、それを使用する意味がありますか?

4

2 に答える 2

13

私の理解では、必要なのは、内部で非同期呼び出しを行うメソッドを作成するときだけですが、そうではないように見せたいとasync思います。つまり、通常のシーケンシャルコードであるかのようにコードを記述および読み取り、通常のシーケンシャルコードであるかのように例外を処理し、通常のシーケンシャルコードであるかのように値を返します。次に、コンパイラの責任は、ロジックを保持する必要なすべてのコールバックを使用してそのコードを書き直すことです。await

あなたの方法はとても単純なので、書き直す必要はまったくないと思います。タスクを返すことができますが、それを消費する人は誰でもawaitその戻り値を求めているかもしれません。

于 2012-09-03T04:55:49.710 に答える
5

なぜ私はしますか:

 public async Task<int> FooAsync()
 {
  return await Task.Run(() => Foo());
 }

あなたはそうしません。以前のバージョンは、すでに待機中のタスクを返します。この新しいバージョンは何も追加しません。

これを使用する方法は次のとおりです。

  FooAsync().ContinueWith((res) => {});

メソッドを停止せずに実行したいのですが、コールバックのようなものを起動したいので、ContinueWithを実行します。

ここで違いが出てきます。例を少し具体化してみましょう。

void DoAsyncStuff()
{
    FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) });
}

を使用してasync、次のような同じコードを記述できます。

void async DoAsyncStuff()
{
    int res = await FooAsync();
    DoSomethingWithInt(res);
}

結果は同じです。キーワードは、メソッドの残りのawait部分を継続に変換し、FooAsyncが値を生成した後に再開されます。他のコードと同じですが、読みやすくなっています。*肩をすくめる*

于 2013-02-19T18:25:01.790 に答える