【问题标题】:What is the exception that makes to throw a Task.ThrowIfExceptional?引发 Task.ThrowIfExceptional 的异常是什么?
【发布时间】:2015-12-06 13:13:24
【问题描述】:

我有一个使用 C# 和 .NET Framework 4.0 运行 Task 开发的 Windows 窗体应用程序。

很抱歉提出这个问题,但我不知道哪里发生了异常。这是堆栈跟踪:

One or more errors occurred.
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at MyCompany.Dispositivos.Plugins.TICAnKorr.DeviceTICAnKorr.StopLive()
   at MyCompany.Dispositivos.Plugins.TICAnKorr.VisorTICAnKorrMini.StopRemote()
   at MyCompany.Dispositivos.InterfazDispositivos.ICBaseVisor.DesasociarDispositivo()
   at MyCompany.Dispositivos.InterfazDispositivos.ControlMosaico.DesasociarTodosLosPaneles()
   at MyCompany.Dispositivos.InterfazDispositivos.ControlMosaico.CrearControlSeleccionado(DeviceBase device)
   at MyCompany.Dispositivos.InterfazDispositivos.ControlMosaico.icPanelViewer_MouseDown(Object sender, MouseEventArgs e)
   at System.Windows.Forms.Control.OnMouseDown(MouseEventArgs e)
   at System.Windows.Forms.UserControl.OnMouseDown(MouseEventArgs e)
   at MyCompany.Dispositivos.InterfazDispositivos.VisorDeMosaico.mousedown(Object sender, MouseEventArgs e)
   at System.Windows.Forms.Control.OnMouseDown(MouseEventArgs e)
   at System.Windows.Forms.UserControl.OnMouseDown(MouseEventArgs e)
   at MyCompany.BasicInterface.Controles_Basicos.ICLabel.lblText_MouseDown(Object sender, MouseEventArgs e)
   at System.Windows.Forms.Control.OnMouseDown(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Label.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Object reference not set to an instance of an object.
   at MyCompany.Dispositivos.Plugins.TICAnKorr.VisorTICAnKorrMini.MensajeEstado()
   at MyCompany.Dispositivos.Plugins.TICAnKorr.VisorTICAnKorrMini.m_DispositivoAsociado_NewResult(Object sender)
   at MyCompany.Dispositivos.ConexionesDispositivos.NewResultsEventHandler.Invoke(Object sender)
   at MyCompany.Dispositivos.ConexionesDispositivos.DeviceBase.OnNewResult()
   at MyCompany.Dispositivos.Plugins.TICAnKorr.DeviceTICAnKorr.HiloCaptura()
   at MyCompany.Dispositivos.ConexionesDispositivos.DeviceBase.<StartLive>b__9()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()

我认为抛出的异常是这样的:

Object reference not set to an instance of an object.
       at MyCompany.Dispositivos.Plugins.TICAnKorr.VisorTICAnKorrMini.MensajeEstado()

真正的例外是什么?

如果这里不适合问这个问题,请告诉我,我删除它。

我不是在问Object reference not set to an instance of an object. 的含义是什么,我知道,我在问这是否是导致任务抛出System.Threading.Tasks.Task.ThrowIfExceptional 的异常。

【问题讨论】:

  • 不能调试代码吗?
  • 不,我无法调试它。这是生产日志。
  • 这里有一个提示:将 PDB 部署到生产环境并记录完整的异常 ToString。这将为您提供有关错误的更多信息。

标签: c# exception task


【解决方案1】:

当您执行返回 Task 的操作时会发生什么,任何异常都会存储在任务的 Task.Exception 属性中。

当您调用Wait 时,代码会等待任务完成,然后重新抛出AggreagtedException 中发生的任何异常。所以在任务完成后会调用ThrowIfExceptional 方法来引发任何发生的异常。

所以问题很可能是在执行任何代码以返回正在等待的任务中的空引用。应该是里面的东西:

 MyCompany.Dispositivos.Plugins.TICAnKorr.DeviceTICAnKorr.StopLive()

【讨论】:

    【解决方案2】:

    这可能会发生,因为您的类中的某些变量为空,并且也没有被处理。我知道你说你知道错误,但最近我遇到了这个错误,我的解决方案是放置运算符'?在可能为空的变量中。

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多