为什么我的异步ASP.NETWebAPI控制器阻塞了主线程?我有一个ASP.NETWebAPI控制器,我最初认为它可以异步操作。控制器设计为针对第一个请求休眠20秒,但会立即为任何后续请求提供服务。所以我的预期时间表是这样的:提出请求1。提出索赔2.提出请求3.要求2次退货。要求3次退货。等待约20秒。请求1退货。相反,在请求1完成之前不会返回任何请求。我可以确认(基于调试输出)入口线程和睡眠线程ID不同。我故意使用TaskCreationOptions.LongRunning将睡眠强制到一个单独的线程,但在睡眠完成之前,应用程序仍然拒绝为任何新请求提供服务。我是否遗漏了有关异步WebAPI控制器工作原理的一些基本知识?公共类ValuesController:ApiController{privatestaticbool_firstTime=true;publicasyncTaskGet(){Debug.WriteLine("入口线程id:{0}.Sync:{1}",Thread.CurrentThread.ManagedThreadId,SynchronizationContext.Current);等待LongWaitAsync();返回“FOOBAR”;}privateTaskLongWaitAsync(){returnTask.Factory.StartNew(()=>{if(_firstTime){_firstTime=false;Debug.WriteLine("Sleepythreadid:{0}.Sync:{1}",Thread.CurrentThread.ManagedThreadId,SynchronizationContext.Current);Thread.Sleep(20000);Debug.WriteLine("Finishedsleeping");}},CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default);}}这其实不是服务端的问题,而是客户端的问题。在第一个请求得到响应之前,Chrome和Firefox似乎都不想发送他们认为是“重复”的请求。两个浏览器的单独“私人”会话将立即从第二个请求返回。InternetExplorer9似乎没有表现出这种行为。为了实现与客户端的隔离,我整理了如下客户端。类程序{staticvoidMain(string[]args){vart1=Task.Run(()=>FetchData(1));vart2=Task.Run(()=>FetchData(2));vart3=Task.Run(()=>FetchData(3));varindex=Task.WaitAny(t1,t2,t3);Console.WriteLine("任务{0}先完成",index+1);Task.WaitAll(t1,t2,t3);Console.WriteLine("所有任务完成");Console.WriteLine("按任意键");控制台.ReadKey(true);}staticvoidFetchData(intclientNumber){varclient=newWebClient();字符串数据=client.DownloadString("http://localhost:61852/api/values");Console.WriteLine("客户端{0}获取数据:{1}",clientNumber,data);它的输出是:Client2getsdata:"FOOBAR"(millisecondsafterstart)Client3getsdata:"FOOBAR"Task2firstfinished(waitlongtimehere)Client1getsdata:"FOOBAR"AlltasksBoth在我的例子中完成输出(它切换到另一个线程从5到10):入口线程ID:5。同步:System.Web.LegacyAspNetSynchronizationContext睡眠线程ID:10。同步:完成睡眠线程“”(0x2c84)已退出代码为0(0x0)。入口线程ID:7。同步:System.Web.LegacyAspNetSynchronizationContext线程“”(0x1818)已退出,代码为0(0x0)。入口线程ID:5。同步:System.Web.LegacyAspNetSynchronizationContext线程“”(0xd4c)已退出,代码为0(0x0)。线程''(0x2c30)已退出,代码为0(0x0)。这可能是由于环境和机器运行(单核)使得运行时决定如何运行它。以上是C#学习教程:WhydoesmyasynchronousASP.NETWebAPIcontrollerblockthemainthread?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
