2015-11-05 54 views
0

我有一組要被拒絕或接受的圖像的,在其上觸發每個視圖頁面的提交和忘記的API請求:等待所有任務C#MVC

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    <h1> 
     @Html.DisplayFor(modelItem => modelItem.Name) 
     <button type="submit" class="btn btn-default" name="isValid" value="true"> 
      <span class="glyphicon glyphicon-ok"></span> 
     </button> 
     <button type="submit" class="btn btn-default" name="isValid" value="false"> 
      <span class="glyphicon glyphicon-remove"></span> 
     </button> 
    </h1> 

    .... 
} 

和在控制器:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Edit(MultimediaEditView multimediaEditView) 
{ 
    var multimedias = db.Multimedias.Where(x => x.IsValid == null && x.IsActive == true); 
    Multimedia multimedia = db.Multimedias.Find(multimediaEditView.ID); 
    multimedia.InjectFrom(multimediaEditView); 

    if (ModelState.IsValid) 
    { 
     if (multimedia.IsValid == true) 
     { 
      if (multimedias.Where(x => x.ProductID == multimedia.ProductID && x.ID != multimedia.ID).Count() != 0) 
       multimedia.UploadToExternalApi(); 
      else 
      { 
       await multimedia.UploadToExternalApi(); 
       multimedia.ProcessRelatedFiles(); 
      } 
     } 

     db.Entry(multimedia).State = EntityState.Modified; 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    ... 
} 
設定我需要檢查所有任務的最後一張圖片上

完成完成發送哪些羣體他們的服務器上的圖像,我在嘗試這裏的另一個API請求之前:

// If not the last image fire and forget 
if (multimedias.Where(x => x.ProductID == multimedia.ProductID && x.ID != multimedia.ID).Count() != 0) 
    multimedia.UploadToApi(); 
// else on the last image wait for it to finish then group 
else 
{ 
    await multimedia.UploadToApi(); 
    multimedia.ProcessRelatedFiles(); 
} 

但是它看起來是不是等待所有的任務就像我以爲它會和似乎有很多的功能等待所有的任務,如果你知道哪些任務運行時,有沒有這樣的事情,當你不知道哪些任務已經被解僱?

+3

您如何期待最終請求瞭解以前請求中已解除的所有其他任務?想象一下,你有一個服務器場 - 每個請求可能會碰到一個不同的服務器...# –

+0

我不會使用服務器場,但如果我會或不會 - 什麼是正確的方式來接近問題「引發多個相關的線程,等待它們完成」? –

+1

問題是(據我瞭解 - 你的描述不是非常清楚),你有多個請求*到你的服務器。所以基本上你需要保留某種持久性標記來確定任務何時完成。您可能希望在同一組圖像的所有請求中共享某種「批次」ID,以便您可以在該批次中的所有內容都完成時詢問API。目前很難說這一點。 –

回答

0

存儲在一個地方的所有任務,你可以稍後訪問,例如在列表中。然後,您可以使用標準await Task.WhenAll。我不明白你爲什麼需要專門處理最後的任務。

有沒有內置的正在運行的任務跟蹤,它真的就不能存在,因爲該框架可不知怎麼,你作爲一個開發者想想你的任務和他們的分組。

我希望你是不是要等待跨越HTTP請求的任務。這通常不可能以可靠的方式進行。需要做別的事情,這是沒有必要的。請勿共享狀態。