请求可以在单独的线程上处理吗?
Can requests be handled on a separate thread?
在我的 ASP.NET MVC Web 应用程序中,我使用的 Web 服务有时可能需要很长时间才能响应。在这种情况下,用户可能希望取消请求并能够发出其他请求。但由于服务器仍在忙于处理前一个请求,用户必须等到那个请求完成。出于这个原因,我决定制作一些异步执行密集 IO 作业的操作方法,希望主线程不会被阻塞。但这无济于事。这是我的方法:
1:public class TestController:AsyncController{
2: public async Task<ActionResult> GetString(){
3:
4: string data=await Task<string>.Factory.StartNew(()=>{
5: return service.GetDataAsString("name");
6: });
7: return View(data);
8: }
9:}
除非服务 returns 预期的字符串,否则不会执行第 7 行,因此仍然阻塞。我需要做什么才能使整个操作在单独的线程中进行?我必须走旧时尚吗?异步方法不是为这类事情设计的吗?
Aren't async methods meant for this kind of things?
不,async
不会更改 HTTP 协议。每个请求仍然只有一个响应,并且该响应只能发送一次。
async
将 释放调用线程,但是在 ASP.NET 这意味着线程返回到线程池并且能够处理其他请求;它不会向用户发送 HTTP 响应。在您的特定情况下,代码首先从线程池 (StartNew
) 中获取一个线程,以便从线程池 (await
) 中释放一个线程,这是毫无意义的。
有一些解决方案应该有效。您可以删除会话状态或用 SignalR 集线器替换此调用(允许其他用户请求,而旧的集线器完成),或者您可以执行此 AJAX 样式 - 最好使用 reliable queue connected to an independent worker process.
在我的 ASP.NET MVC Web 应用程序中,我使用的 Web 服务有时可能需要很长时间才能响应。在这种情况下,用户可能希望取消请求并能够发出其他请求。但由于服务器仍在忙于处理前一个请求,用户必须等到那个请求完成。出于这个原因,我决定制作一些异步执行密集 IO 作业的操作方法,希望主线程不会被阻塞。但这无济于事。这是我的方法:
1:public class TestController:AsyncController{
2: public async Task<ActionResult> GetString(){
3:
4: string data=await Task<string>.Factory.StartNew(()=>{
5: return service.GetDataAsString("name");
6: });
7: return View(data);
8: }
9:}
除非服务 returns 预期的字符串,否则不会执行第 7 行,因此仍然阻塞。我需要做什么才能使整个操作在单独的线程中进行?我必须走旧时尚吗?异步方法不是为这类事情设计的吗?
Aren't async methods meant for this kind of things?
不,async
不会更改 HTTP 协议。每个请求仍然只有一个响应,并且该响应只能发送一次。
async
将 释放调用线程,但是在 ASP.NET 这意味着线程返回到线程池并且能够处理其他请求;它不会向用户发送 HTTP 响应。在您的特定情况下,代码首先从线程池 (StartNew
) 中获取一个线程,以便从线程池 (await
) 中释放一个线程,这是毫无意义的。
有一些解决方案应该有效。您可以删除会话状态或用 SignalR 集线器替换此调用(允许其他用户请求,而旧的集线器完成),或者您可以执行此 AJAX 样式 - 最好使用 reliable queue connected to an independent worker process.