C# 等待MVC中的所有任务
我有一组要拒绝或接受的图像,在提交它触发的每个查看页面时,会忘记API请求:C# 等待MVC中的所有任务,c#,asp.net-mvc,task,C#,Asp.net Mvc,Task,我有一组要拒绝或接受的图像,在提交它触发的每个查看页面时,会忘记API请求: @using (Html.BeginForm()) { @Html.AntiForgeryToken() <h1> @Html.DisplayFor(modelItem => modelItem.Name) <button type="submit" class="btn btn-default" name="isValid" value="tru
@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>
....
}
然而,它看起来并不像我想象的那样等待所有任务,而且似乎有很多功能可以等待所有任务如果你知道哪些任务正在运行,当你不知道哪些任务被触发时,是否有类似的情况?将所有任务存储在一个你以后可以访问的地方,例如在一个列表中。然后,您可以使用标准的wait Task.WhenAll。我不明白你为什么要特别对待最后一项任务 没有对正在运行的任务的内置跟踪,它实际上不可能存在,因为框架不知道作为开发人员您如何看待任务及其分组
我希望您不要试图等待跨越HTTP请求的任务。这通常不可能以可靠的方式实现。需要做一些其他的事情,这样就没有必要了。不要在请求之间共享状态。您希望最终请求如何知道以前请求中触发的所有其他任务?假设您有一个服务器场-每个请求可能会命中不同的服务器…我不会使用服务器场,但如果我愿意或不愿意-解决问题的正确方法是什么激发多个相关线程,等待他们完成?好吧,问题就在我所能理解的范围内-你的描述不是非常清楚-你有多个对服务器的请求。因此,基本上,您需要保留某种持久性标记,以确定任务何时完成。您可能希望在对同一组图像的所有请求中共享某种批次ID,以便在该批次中的所有内容都完成时可以询问API。现在很难说Though。对不起,我添加了更多信息来帮助澄清这个问题,但是的,我认为基本上就是这样。我希望我不需要保留任何信息,只需询问iis任务是否已完成运行?如果不将自己绑在一台主机上,这是不可能的;b关于AppDomain回收的假设。基本上,您应该能够认为对代码的请求是完全独立的——如果存在共享状态,那么应该适当地标识和持久化。
[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");
}
...
}
// 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();
}