2015-11-05 49 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请求的任务。这通常不可能以可靠的方式进行。需要做别的事情,这是没有必要的。请勿共享状态。