加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 嵌套调用中的异步和等待.没有等待等待导致IIS崩溃的方法

发布时间:2020-12-16 00:07:26 所属栏目:百科 来源:网络整理
导读:我一直在网上看,我有一些问题,希望有人在这里可以回答我.我正在尝试解决导致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修饰符似乎应该可以解决问题.

解决方法

This service call is supposed to be a fire and forget type of call.

希望你没有任何重要的代码,因为IIS wasn’t designed to be used like this.

[Stack trace] … LegacyAspNetSynchronizationContext …

红色标志! LegacyAspNetSynchronizationContext无法与async和await完美匹配.

请确保您在web.config中具有以下设置:

<appSettings>
   <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>

如果您在FireAndForgetAsync中执行实际业务逻辑,那么您应该更改您的体系结构:将DoAction后期工作发送到持久存储(例如,Azure队列)并拥有独立的非IIS服务(例如,Azure工作者角色)处理在队列中工作.

如果您的FireAndForgetAsync工作不重要,那么您可以使用类似于BackgroundTaskManager type on my blog的方法来缓解此方法的问题…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读