无需等待即可启动任务

use*_*833 12 c# parallel-processing asp.net-mvc task

我正在使用asp.net mvc,我想在他到达网站的主页时从数据库中缓存一些关于用户的数据.因此,当用户请求主页时,我想调用异步方法,该方法进行数据库调用和缓存数据.

这样做的任何例子都会很棒.

Oli*_*old 21

public class HomeController : Controller
{
  public ActionResult Index()
  {
    ViewData["Message"] = "Welcome to ASP.NET MVC!";

    Task.Run(()=> DoSomeAsyncStuff());

    return View();
  }

  private async void DoSomeAsyncStuff()
  {

  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您应始终避免将“异步无效”作为一种好习惯。而是使用“异步任务” (3认同)

Ron*_*ael 18

对于.NET Core,我使用这个

_ = Task.Run(() => SomeAsyncFunction());
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 13

获得最高票数的答案都建议使用Task.Run,这对于 ASP.NET Core 来说是一个非常糟糕的做法,因为它可能会导致线程匮乏(因为Task.Run安排任务在线程池上运行,并且需要线程池线程来处理 http 请求)。

如果您确实想要“即发即忘”(a)真正异步并且(b)该方法处理其中的所有异常的方法,那么只需执行以下操作:

_ = DoSomething();
Run Code Online (Sandbox Code Playgroud)

假设该方法是

public async Task DoSomething()
{
}
Run Code Online (Sandbox Code Playgroud)

  • 您正在使用“Thread.Sleep”,这在“async”中是被禁止的。调用 Thread.Sleep 会冻结整个事情。请改用“await Task.Delay()”。 (4认同)
  • @Alex *“`Task.Run` 在新线程中运行您的代码。”* - 实际上 [`Task.Run`](https://learn.microsoft.com/en-us/dotnet/api/system. threading.tasks.task.run) 在“ThreadPool”上运行代码。 (2认同)

eFl*_*loh 0

ThreadPool.QueueUserWorkItem((Action<object>)state =>
{
    //do your async work
}, null);
Run Code Online (Sandbox Code Playgroud)

或者Task.StartNew(...)

(抱歉,我的回答很简短,这可能会带您走上正确的道路,或者有人可以编辑它以显示完整的示例,好吗?)