簡體   English   中英

在異步操作完成之前從方法返回的不良做法?

[英]Bad practice to return from method before async operation completes?

我有一個Web API 2端點,我希望在檢索和驗證用戶時異步執行操作。 如果此用戶不存在,我想返回404 Not Found,如下所示:

public async Task<IHttpActionResult> Get()
{
    var getCatTask = GetCatAsync();
    var user = await GetUserAsync();

    if(user == null)
    {
        return NotFound();
    }     

    var cat = await getCatTask;

    return Ok(cat);
}

如果用戶等於null並且在沒有等待getCatTask的情況下返回方法或者它被認為是一種不好的做法,這會導致我潛在的問題嗎?

這並不是很糟糕 ,因為在這種情況下,你只是在閱讀數據,而你只是忽略了結果。 對於每個虛假請求(這可能不會經常發生),您將承擔額外的GetCatAsync操作的成本。

如果可能,請考慮使GetCatAsync可取消,然后您將能夠在返回之前至少開始清理:

public async Task<IHttpActionResult> Get()
{
  var cts = new CancellationTokenSource();
  var getCatTask = GetCatAsync(cts.Token);
  var user = await GetUserAsync();

  if (user == null)
  {
    cts.Cancel();
    return NotFound();
  }     

  var cat = await getCatTask;
  return Ok(cat);
}

這是完全可以接受的。 asyncawait ,你沒有做任何不正確的事情。 關於關鍵字的一些注意事項:

async關鍵字只是啟用了await關鍵字的使用。 await關鍵字是所有“魔法”發生的地方,即; 異步狀態機將暫停方法執行並在“等待”異步操作完成時返回到該點。

一個重要的考慮:

GetCatAsync()是否返回表示已啟動的異步操作的TaskTask<T> 如果是這樣可能會有點問題,如果不是你就好了,因為它等待以后。 我建議添加取消。

public async Task<IHttpActionResult> Get()
{
    var cts = new CancellationTokenSource();
    var getCatTask = GetCatAsync(cts.Token);
    var user = await GetUserAsync();

    if (user == null)
    {
        cts.Cancel();
        return NotFound();
    }     

    var cat = await getCatTask;
    return Ok(cat);
}

但是,斯蒂芬克利里打敗了我 - 在上面喊出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM