注意:这是概念框架问题,而不是VB.Net特定的问题。也可以在C#中提问。
我在应用程序启动时添加了以下处理程序:
AddHandler System.Windows.Forms.Application.ThreadException, AddressOf UIThreadException
它工作正常,处理程序获取每个异常
除了我使用标准System.Windows.Forms.WindowsFormsSynchronizationContext.Send()
将调用从自定义后台线程(队列处理)传递到主线程的情况。然后在主线程中成功执行执行,但抛出的任何异常都不会触发上述处理程序,并且抛出未处理的异常。
您有任何经验,这是框架的预期行为吗?
答案 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