在具有单个后端调用的控制器方法上使用任务是否明智?
Is it smart to use tasks on controller methods having a single backend call?
在 Controller 方法 上使用 Task 有什么好处吗
单个后端调用?
(例如:来自 SQL 服务器的简单 select)如下所示
public Task<string> Get(int id)
{
return Task.Run(() =>
{
return SimpleSelectFromDB();
});
}
而不是(同步)
public string Get(int id)
{
return SimpleSelectFromDB();
}
在服务器端代码中使用 Task.Run()
几乎没有任何优势。
您所做的只是离开一个线程池线程并转到另一个线程。
相反,您应该更改后端调用以使用非阻塞 IO 并 await
直接使用它。
Is there any advantage of using Task on Controller method having a
single backend call?
让我们从在 ASP.NET is dangerous. It can cause offloaded work to be terminated once an IIS recycle kicks in. If you want to offload to a background thread, use either HostingEnvironment.QueueBackgroundWorkItem
or AspNetBackgroundTasks
中调用 Task.Run
来注册他们的工作开始。
在您当前的示例中,您正在执行自然异步的工作,例如调用对数据库的调用。不需要线程池线程来执行此操作,您可以使用自然异步 API,例如 Entity Framework(从 V6 及更高版本开始)等数据库提供程序提供的那些并利用它们。这些异步 API 现在以 API 的形式出现,即 return 一个 Task
或一个 Task<T>
,它符合 TAP(任务异步模式)与 async-await
.
配合得很好
在 Controller 方法 上使用 Task 有什么好处吗 单个后端调用?
(例如:来自 SQL 服务器的简单 select)如下所示
public Task<string> Get(int id)
{
return Task.Run(() =>
{
return SimpleSelectFromDB();
});
}
而不是(同步)
public string Get(int id)
{
return SimpleSelectFromDB();
}
在服务器端代码中使用 Task.Run()
几乎没有任何优势。
您所做的只是离开一个线程池线程并转到另一个线程。
相反,您应该更改后端调用以使用非阻塞 IO 并 await
直接使用它。
Is there any advantage of using Task on Controller method having a single backend call?
让我们从在 ASP.NET is dangerous. It can cause offloaded work to be terminated once an IIS recycle kicks in. If you want to offload to a background thread, use either HostingEnvironment.QueueBackgroundWorkItem
or AspNetBackgroundTasks
中调用 Task.Run
来注册他们的工作开始。
在您当前的示例中,您正在执行自然异步的工作,例如调用对数据库的调用。不需要线程池线程来执行此操作,您可以使用自然异步 API,例如 Entity Framework(从 V6 及更高版本开始)等数据库提供程序提供的那些并利用它们。这些异步 API 现在以 API 的形式出现,即 return 一个 Task
或一个 Task<T>
,它符合 TAP(任务异步模式)与 async-await
.