【问题标题】:Why exception is not caught in BackgroundWorker DoWork routine?为什么BackgroundWorker DoWork例程中没有捕获异常?
【发布时间】:2011-06-07 17:25:50
【问题描述】:

我要么抛出异常,要么在 DoWork 中自然诱发它,它没有被捕获,控制也没有传递给工作完成例程,而是得到我在 Program.cs 文件中捕获的异常

Type: System.Reflection.TargetInvocationException
Source: mscorlib
Message: Exception has been thrown by the target of an invocation.
Target Site: System.Object _InvokeMethodFast(System.IRuntimeMethodInfo, System.Object, System.Object[], System.SignatureStruct ByRef, System.Reflection.MethodAttributes, System.RuntimeType)
Module Name: mscorlib.dll
Module Path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
Stack:
  at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
  at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
  at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
  at System.Delegate.DynamicInvokeImpl(Object[] args)
  at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
  at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
  at System.Threading.ExecutionContext.runTryCode(Object userData)
  at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
  at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
  at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
  at System.Windows.Forms.Control.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.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
  at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
  at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
  at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
  at System.Windows.Forms.Application.Run(Form mainForm)

程序中的代码 sn-p

// ...
BackgroundWorker worker = new BackgroundWorker();                
worker.WorkerSupportsCancellation = true;
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);                
worker.RunWorkerAsync(); 
// ...

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    // ... 
    throw new Exception("I want to be caught and passed to completed event handler")   
    // ...
}

【问题讨论】:

  • 请举例说明您如何使用BackgroundWorker
  • 这种异常一般有InnerException,能不能也提供一下?
  • 没有InnerExceptions,我只是手动抛出
  • 我加了代码sn-p
  • ...抱歉有内部异常:“无法启动非本地服务器”在 Ayonix.PublicSecurity.PublicSecurityServerServiceRunningState.RunningStateWorker_DoWork(Object sender, DoWorkEventArgs e) in C:\\... my code.cs:System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 的第 149 行,位于 System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

标签: .net exception backgroundworker


【解决方案1】:

您也可以尝试在worker_DoWork 中捕获您的异常。这样就可以确保不会在其他地方传播。

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 2021-04-13
    • 2011-11-28
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多