【问题标题】:async await Task null reference exception异步等待任务空引用异常
【发布时间】:2016-08-18 15:17:04
【问题描述】:

我正在维护的 Web 表单项目中收到 NullReferenceExceptions。问题是这个异常没有堆栈跟踪,因为我的代码都没有导致异常。

复制到剪贴板的异常详细信息提供零帮助:
System.NullReferenceException was unhandled Message: An unhandled exception of type 'System.NullReferenceException' occurred in mscorlib.dll Additional information: Object reference not set to an instance of an object.

当我查看非用户代码堆栈跟踪时,我看到以下内容(全部在 mscorlib 中):

错误随机且不一致地发生,无论是通过加载页面还是通过回发。在我添加 System.Net.Http.HttpClient 以从其他站点上公开的 REST 服务中提取数据之后,问题就开始了。请注意,HttpClient 仅包含用于发送/接收数据的异步方法。根据内部堆栈跟踪,我高度怀疑 Task / async / await 是罪魁祸首。

为了帮助进行故障排除,让我再次确认我是在一个使用 .NET 4.6 编译的 WebForms 站点中运行它(如果你要告诉我我的问题是我需要升级到 MVC,请保存你的击键不要说出来)。虽然 HttpClient 将所有内容公开为 Task,但我通过以下方式同步调用它们:
Task<MyObject> myResultTask = restClient.GetResultAsync(); MyObject myResult = myResultTask.Result; // no await

提前致谢!

【问题讨论】:

  • 只是调用等待大声笑
  • @RenéVogt 如果我没记错的话,你可以很容易地遇到各种奇怪的问题而无需等待
  • 另外,你为什么首先使用HttpClient?如果您需要同步 Web 请求,请使用 WebClientHttpClient 是专门为async/await 风格的代码设计的,而Result 和朋友可以死锁。
  • @JoeyHerrington:从长远来看,我肯定会说使用4.5 并升级它破坏的东西。短期内您可以尝试设置aspnet:UseTaskFriendlySynchronizationContext(详情in the original blog post)。这可能有效。

标签: c# asp.net asynchronous nullreferenceexception mscorlib


【解决方案1】:

我刚遇到这个问题,并想建议将此作为答案。

在您的 web.config 中确保您具有以下内容:

  <system.Web>
      <httpRuntime targetFramework="4.5" />
  </system.Web>

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

在此处查看更多信息:

https://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/

如果您不这样做,它似乎只是随机崩溃。我是向后兼容性的忠实拥护者,但如果您不选择新方式,它就会崩溃。

(在 Stephen Cleary 的评论中建议)

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2013-02-10
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多