![](/img/trans.png)
[英]C# DataFlow: Wait for all tasks started by ConcurrentExclusiveSchedulerPair to finish
[英]Wait for all Tasks C# MVC
我在每次觸發的每個視圖頁面的提交中都有一組圖像被拒絕或接受,並且忘記了API請求:
@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();
}
但是,看起來它並沒有像我想的那樣等待所有任務,並且如果您知道哪些任務正在運行,似乎有很多功能可以等待所有任務,而當您不知道哪些任務時是否會有類似的事情發生被解雇了?
將所有任務存儲在以后可以訪問的位置,例如列表中。 然后,您可以使用標准的await Task.WhenAll
。 我不明白為什么您需要特別對待最后一個任務。
沒有內置的對正在運行的任務的跟蹤,它實際上是不存在的,因為框架不知道您作為開發人員如何看待您的任務及其分組。
我希望您不要試圖等待跨HTTP請求的任務。 通常不可能以可靠的方式做到這一點。 需要做其他事情,這樣就沒有必要了。 不要在請求之間共享狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.