【发布时间】:2013-04-16 04:07:53
【问题描述】:
我一直在网上寻找一些问题,希望这里有人可以为我解答。我正在尝试解决导致 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 修饰符似乎应该可以解决问题。
【问题讨论】:
标签: c# async-await c#-5.0