2011-01-25 4 views
1

ためのawaitを使用して、私はこのようなものがあります:非CPU集約的なタスク

private void DoSomething() 
{ 
    System.Console.WriteLine("Creating Foo"); 
    Foo result = new Foo(); 

    DoSomethingAsync(); 

    System.Console.WriteLine("Returning Foo"); 
    return result; 
} 


private async void DoSomethingAsync() 
{ 
    // The following task takes a long time, but is not CPU intensive 
    await TaskEx.Run(() => 
    { 
     // code lives here... removed for this example 
    }); 
} 

私は多くのCPUをヒットしていないので、私はスレッドを必要としませんが。スレッドの作成を避けるために、実行の代わりに何を使用できますか?

+0

私は完全に間違っている可能性がありますが、非同期の処理を行う場合は、その処理を非同期で行うために別のスレッドを用意する必要があります。同じスレッド上に置くとブロックされ、同期します。 –

+0

Asyncライブラリについて私が理解したのは、Windowsメッセージポンプを使ってコールバックを作成し、実際にスレッドを使わずにスレッドの外観(非同期実行)を与えるような方法でコードの実行を管理することでした。つまり、タスクの「実行」メソッドを使用しない限り、スレッドが取得されます。実行は、CPUを集中的に使用する場合にのみ推奨されます。 Anders Hejlsbergさんが提供したPDC 2010の講演では、これがうまく説明されています: http://bit.ly/bBGOfV – mbursill

+0

TaskEx.Run()でコードを抽出し、そのメソッドでawaitステートメントを呼び出すのはなぜですか? – Rob

答えて

1

ここでは、タスク非同期パターンの意図を誤解していると思います。あなたがやっていることはおそらくThreadPool.QueueUserWorkItemによって処理されるでしょう。プロセスのプールからワーカースレッドを再利用し、必要に応じてワーカースレッドを作成するだけです。

TAPを使用すると、タスクを段階的に処理できる作業の「チャンク」に分割できますが、「これはバックグラウンドタスクです」と言っても意味がありません。

+0

ええと、大丈夫ですが、バックグラウンドタスクが必要ない場合はどうすればいいですか? 私の仕事がやっている仕事の詳細(サードパーティのCOMライブラリに話を聞いたり、乱雑になるなど)は望んでいませんが、言うまでもなく、ほとんどの場合、多くのことをしています何もないそれは純粋なWebサービス/ネットワークのものではないので、私はDownloadStringTaskAsyncのような組み込みのメソッドを使用することはできません。 しかし、リクエストを送信し、応答を待っている間にブロックします。 Asyncのlibを使用するには、完璧なことですか?私がしようとしているのは、 "DownloadStringTaskAsync"に似た独自のメソッドを構築することだと思います。 – mbursill

+1

実際、いいえ。 TAPは、実際にブロックする代わりに実際に戻ることができる場合にのみ**有益です。コンパイラの 'async'メソッド修飾子は単にあなたのコードをこのスタイルに変換するよう指示します。 'async/await'で書かれていないサードパーティのブロッキングコードを念頭に置いて呼び出す場合は、スレッドを使用する必要があります。 –

+0

あなたの権利。この新しいフレームワークは本当に私を混乱させました。ありがとう。 – mbursill

0

これは、実行しているタスクによって異なります。あなたはそれが多くのCPUを使用していないと言うので、私は他のイベントを待っているので、タスクが長い時間かかると仮定します。したがって、各コールバックはメインスレッドですばやく完了し、実際に待機するイベントが発生するまでは起動されないイベントのコールバックを登録するようにタスクを設計する必要があります。

関連する問題