在C#

时间:2015-07-14 19:04:00

标签: c# asynchronous

我有一个用C#编写的ASP.NET MVC应用程序。我的一个动作如下:

[HttpPost]
public async Task<ActionResult> Save(int id, MyViewModel viewModel)
{
  viewModel.SaveToDb();

  await Backup.Save(viewModel);
  return View(viewModel);
}

...

public class Backup
{
  async public static Task Save(IBackup item)
  {
    // do stuff
  }
}

Backup.Save功能实际上有很多功能。事实上,await Backup.Save(...)目前需要10秒钟。出于这个原因,我想在后台运行它(异步)而不是(a)等待它。我想如果我刚删除了await关键字,那就行了。但是,似乎并非如此。

如何运行备份会在后台异步保存,以便我的用户可以在没有长时间等待的情况下继续使用该应用程序?

谢谢!

2 个答案:

答案 0 :(得分:2)

请看这里讨论: Can I use threads to carry out long-running jobs on IIS?

一个简单的替代方案是在不必使用线程或队列的情况下,通过客户端进行额外的异步调用,假设客户端是浏览器,可能通过Ajax进行。

如果您需要立即返回视图模型,则可能将其拆分为两种方法。一个获取视图模型,然后调用第二个在后台执行保存的方法。

这应该可以正常工作,因为如果你很乐意马上回来,你已经暗中同意将这两种行为之间的依赖性脱钩。

这有点像黑客,因为客户现在正在请求他们可能不需要知道或关心的行动。

答案 1 :(得分:0)

你可以创建一个采取动作或函数的方法(无论你需要什么),并运行一个线程,包含你需要在后台运行的任何东西。

基本上无论你选择哪种方式,都可以在一个单独的线程中运行该方法。