- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下两个应用程序:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
}
void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.Exception.GetType());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Dispatcher.BeginInvoke((ThreadStart)delegate
{
throw new AccessViolationException("test");
}, DispatcherPriority.Input);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
}
void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.Exception.GetType());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke((Action)delegate
{
throw new AccessViolationException("test");
}, DispatcherPriority.Input);
}
}
除了使用两种不同的委托(delegate)类型 Action
和 ThreadStart
(尽管它们具有相同的签名)之外,这两个应用程序是相同的。
结果(输出窗口,当您使用按钮单击调用事件处理程序时)
为什么应用程序的行为不同?
异常 #1 的完整堆栈:
System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.AccessViolationException: test
bei ExceptionTest.MainWindow.<Button_Click>b__0() in c:\Users\fschmitz\Documents\Visual Studio 11\Projects\ExceptionTest\MainWindow.xaml.cs:Zeile 40.
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
bei System.Delegate.DynamicInvokeImpl(Object[] args)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
最佳答案
我认为罪魁祸首在于 ExceptionWrapper
的 InternalRealCall
方法。更具体地说,我们有 Action
代表特殊情况的以下部分。
Action action = callback as Action;
if (action != null)
{
action();
}
else
{
// ... removed code ..
obj = callback.DynamicInvoke();
}
由于 Action
委托(delegate)被直接调用,因此产生的异常就是您最初抛出的异常。对于所有其他委托(delegate)类型,由于调用是通过反射进行的,因此异常被包装在 TargetInvocationException
中。
总而言之,差异是与如何直接或通过反射调用提供的委托(delegate)相关的副作用。
关于c# - 为什么 Dispatcher.BeginInvoke 为 ThreadStart 解包 TargetInvocationException 而不是为 Action 解包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745420/
我有一个计时器执行一个执行一系列线程的循环。每个线程简单地轮询串行设备(在唯一端口上)并将数据写入 MySQL 数据库以供 Web 应用程序获取。 我注意到只有循环中的最后一个线程正在执行。 这是我的
有人可以解释一下我们为什么使用 ThreadStart 吗? new Thread (new ThreadStart (Update)).Start(); -Versus- new Thread (U
C#中如何启动带参数的线程? 最佳答案 Thread 构造函数的 2 个重载之一采用 ParameterizedThreadStart 委托(delegate),它允许您将单个参数传递给 start
我正在尝试学习 .Net 中的线程。 你们中的许多人一定见过这个: private void button1_Click(object sender, EventArgs e) { Threa
我创建了一个新线程并为其分配了一个函数以使用 ThreadStart 执行。这里有一个例子: this.threadAppPtE = new Thread(new ThreadStart(synchr
执行以下代码会产生错误:ProcessPerson 的重载与 ThreadStart 不匹配。 public class Test { static void Main()
在我必须维护的旧应用程序中进行一些取证考古调查时,我遇到了这个: 这是一个最近转换为 .NET 4.0 的 WPF 应用程序,此代码在后台工作程序中运行 if(bgWorker1
我想在新线程中以 void 作为返回类型运行函数,但它总是显示此错误: No overload for 'myVoid' matches delegate 'ThreadStart' 和我的代码: T
我有一个 Windows 窗体,我在其中打开新线程以进行服务器通信。我需要在表单中(在文本框中)写下服务器如何响应查询。 目前我做服务器通信如下: ServerClass SC = new Serve
有人知道之间的区别吗 Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() => { 和 Dispatche
我对 vb.net 中的 ThreadStart 委托(delegate)有疑问。我正在接手一个高级程序员的项目,他比我更有经验,所以我对他想做的事情有点迷茫。我正在尝试对线程进行一些研究,但是关于这
我有一个 Windows 服务,它使用 Thread 和 SemaphoreSlim 每 60 秒执行一些“工作”。 class Daemon { private SemaphoreSlim
我不能有一个匿名委托(delegate)声明,类似于以下内容: ThreadStart starter = delegate() { go(); }; ...
两者都是委托(delegate)并且具有相同的签名,但我不能将 Action 用作 ThreadStart。 为什么? Action doIt; doIt = () => MyMethod("test
我在一个紧凑的框架项目中使用线程,代码如下所示。当我尝试进入 StartThreads() 时,会抛出 NotSupportedException。这似乎有点奇怪,为什么在调用 StartThread
我的问题是将 this.folderFolder 实例方法传递给 ThreadStart 构造函数。我使用 dirAssThread 单步执行它并观察它正确更新实例数据成员并完成,然后我回到 if (
我需要将 C# 代码转换为 VB.NET 代码(基于 .NET 3.5 和 VS 2008),但我在将 C# 委托(delegate)转换为其 VB.NET 等效代码时遇到了问题。 我要转换的 C#
考虑以下两个应用程序: 1: public partial class MainWindow : Window { public MainWindow() { Init
很抱歉,如果之前有人问过这个问题,但我想就以下两种用法之间的区别提供一个简明的答案。 VS 似乎将它们都接受为有效代码。 private static void doSomeWork() { /
我是一名优秀的程序员,十分优秀!