c# – 嵌套调用中的异步和等待.没有等待等待导致IIS崩溃的方法
我一直在网上看,我有一些问题,希望有人在这里可以回答我.我正在尝试解决导致IIS崩溃的问题.这个服务呼叫应该是一个火灾和忘记呼叫类型.如果失败,我们禁止并记录异常.因为它是一个长期运行的服务调用,所以它被实现为异步.当前实现有几个嵌套方法调用如下:
// in first service public void PerformService(some params) { // setup and validation DoAction(); } private void DoAction() { // final setup OtherService.FireAndForgetAsync(some params); } // in the other service (OtherService) public async Task FireAndForgetAsync() { await Task.Run(() => { try { // do some long running stuff } catch (Exception e) { ErrorLogger.LogError(e) } } } 实际上,我们在一个循环(从0到多次迭代)中调用PerformService并且当前得到以下异常: System.NullReferenceException: Object reference not set to an instance of an object. at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonati onContext) at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationCo ntext) at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback,Object state) at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallb ack callback,Object state) at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback call back,Object state) at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAct ion(Object state) at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback c allback,Object 即使我在try catch块中强制发生异常(测试我们的错误记录器),它也会被我们的错误记录器正确捕获并记录.看起来某些线程在请求??完成后仍在尝试执行SynchronizationContext.Post.我认为我们不正确地使用C#5的async / await,因为FireAndForgetAsync正在等待,但没有别的.所以,我们说我们要等待,然后离开. http请求结束,然后由于没有任何东西可以同步,它无法自动同步.不好,因为这完全崩溃IIS.我主要是在寻找其他人的输入,因为我不太熟悉C#5中的async / await以及适当的解决方案.由于我们不想等待它完成,因此从FireAndForgetAsync方法中删除await和async修饰符似乎应该可以解决问题. 解决方法
希望你没有任何重要的代码,因为IIS wasn’t designed to be used like this.
红色标志! LegacyAspNetSynchronizationContext无法与async和await完美匹配. 请确保您在web.config中具有以下设置: <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> 如果您在FireAndForgetAsync中执行实际业务逻辑,那么您应该更改您的体系结构:将DoAction后期工作发送到持久存储(例如,Azure队列)并拥有独立的非IIS服务(例如,Azure工作者角色)处理在队列中工作. 如果您的FireAndForgetAsync工作不重要,那么您可以使用类似于 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – try / catch块中的Response.Redirect异常
- ajax表单序列化
- Ruby和SystemVerilog DPI
- c – 具有std :: function不同签名的Lambda函数
- sqlite3相关编译问题:updefined reference to `sqlite3_cl
- 使用SDK23报错:Binary XML file line #17: invalid drawab
- Flash builder 文件 登陆上服务器的原因
- ajax传值(中文)乱码的解决方案
- C++ string split()和 replaceAll()
- [Sqlite] --> Sqlite在Windows、Linux 和 Mac OS X 上的安装