如果在UI线程中引发异常但是在另一个线程中引发异常会引发UI ThreadException吗?

时间:2015-01-27 22:56:25

标签: .net multithreading exception-handling

注意:这是概念框架问题,而不是VB.Net特定的问题。也可以在C#中提问。

我在应用程序启动时添加了以下处理程序:

AddHandler System.Windows.Forms.Application.ThreadException, AddressOf UIThreadException

它工作正常,处理程序获取每个异常

除了我使用标准System.Windows.Forms.WindowsFormsSynchronizationContext.Send()将调用从自定义后台线程(队列处理)传递到主线程的情况。然后在主线程中成功执行执行,但抛出的任何异常都不会触发上述处理程序,并且抛出未处理的异常。

您有任何经验,这是框架的预期行为吗?

1 个答案:

答案 0 :(得分:2)

问题是Send(...)方法。

查看来源:

// Summary:
//     When overridden in a derived class, dispatches a synchronous message to a
//     synchronization context.
// Parameters:
//   d:
//     The System.Threading.SendOrPostCallback delegate to call.
//   state:
//     The object passed to the delegate.
public virtual void Send(SendOrPostCallback d, object state);

此方法同步,因此它基本上在线程内部处理。 但我们可以看看Post(...)方法。

// Summary:
//     When overridden in a derived class, dispatches an asynchronous message to
//     a synchronization context.
// Parameters:
//   d:
//     The System.Threading.SendOrPostCallback delegate to call.
//   state:
//     The object passed to the delegate.
public virtual void Post(SendOrPostCallback d, object state);

这意味着Post不会等待委托的执行完成。 Post将对代表中的执行代码进行“解雇并忘记”。它还意味着您无法像使用Send方法那样捕获异常。假设抛出异常,它将是获取它的UI线程;取消处理异常将终止UI线程。

此处的其他信息: http://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I