今、私のメソッドは次のようになります。ビジネスで私はビジネス/サービス/アプリケーション層の間で非同期待機を使用する必要があります
プロダクトマネージャークラスのサービスで
public static async Task<List<ProductItem>> GetAllProducts()
{
var context = GetMyContext();
return await context.Products.select(x =>
new ProductItem{ //create item})
.ToListAsync();
}
ProductServiceクラス。
public async Task<List<ProductItem>> GetAllProducts()
{
return await ProductManager.GetAllProducts();
}
ProductController in application。
public async Task<ActionResult> Index()
{
var ps = new ProductService();
var productsAsync = ps.GetAllProducts();
// Do other work.
var products = await productsAsync;
return View(products);
}
このアプリケーションは、高い使用率を取得し、 は完全に間違ってそれをやって、この方法は何ですか? 私はあらゆる方法を待つべきですか? これは、awaitが呼び出されるたびに新しいスレッドを開始しますか?
'await'は何かが完了するのを待っています。あなたのメソッドでタスクの結果を必要としない場合は、それを待つ必要はありません。 'GetAllProducts'は単に' ToListAsync'の結果を返すべきです –
"これはawaitが呼び出されるたびに新しいスレッドを開始しますか?"これはよくある誤解です - 「待って」は何も開始しません。それがすることは、*忠実に*タスクやタスクのようなオブジェクトが既に開始されているものを終えるのを待つことです。* 'Task'がそれを達成している(スレッドの開始、I/Oのキューイングなど)方法は、あなたのコードを' Task'に戻したメソッドの責任です。 –
まず、ここの 'ProductService'は無意味です。サービスメソッドで作業をするか、単に 'ProductManager'を直接使用してください。ここでは、2つの重複したAPIを管理するだけです。次に、 'var products = ps.GetAllProducts();'を待ちます。タスクを変数に最初に保存する必要はありません。最後に、以下の@PanagiotisKanavosのアドバイスに耳を傾けます:メソッド自体がTaskを返す場合は、内部に何かを待ってはいけません。タスクを返すだけです。 (実際には、そのメソッドのTaskの結果で何かを行う必要がある場合を除きます)。 –