Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理COM库从工作线程引发的异常?_C#_Multithreading_Exception_Com - Fatal编程技术网

C# 如何处理COM库从工作线程引发的异常?

C# 如何处理COM库从工作线程引发的异常?,c#,multithreading,exception,com,C#,Multithreading,Exception,Com,我正在构建一个使用COM库的.Net应用程序(我在COM方面非常糟糕,但我需要使用regsvr32注册它的库,并且在visual studio中引用后,它会说文件类型是ActiveX) 在控制台应用程序中,我正在创建一个新的COM对象,如下所示: static void Main(string[] args) { var comObj = new EikonDesktopDataAPI(); comObj.OnStatusChanged += EikonDesktopDataAp

我正在构建一个使用COM库的.Net应用程序(我在COM方面非常糟糕,但我需要使用
regsvr32
注册它的库,并且在visual studio中引用后,它会说文件类型是ActiveX)

在控制台应用程序中,我正在创建一个新的COM对象,如下所示:

static void Main(string[] args)
{
    var comObj = new EikonDesktopDataAPI();
    comObj.OnStatusChanged += EikonDesktopDataApi_OnStatusChanged;
    comObj.Initialize();
    Console.ReadLine();
}

private void EikonDesktopDataApi_OnStatusChanged(EEikonStatus status)
{
    try{
        throw new Exception("An exception 1.");
    }catch(Exception ex){
        throw new Exception("Tell the main thread." , ex);
    }
}
因此,应用程序在主线程上同步初始化Api,并等待
Console.ReadLine()
。几秒钟后,将触发
EikonDesktopDataApi_OnStatusChanged
事件。调试时,我可以看到这是在工作线程上处理的。由于异常是在另一个线程上引发的,因此控制台应用程序不会崩溃。如何捕获此异常

我试图在Main方法上添加
slathreadtribute
,但这会导致事件永远不会引发

我还尝试使用:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
但是这个异常也没有被处理

我发现“捕获”异常的唯一方法是使用:

AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
但这会导致处理程序方法处理3个异常:
“异常1”
,然后
“告诉主线程。”
,最后调用的目标抛出了一个
“异常”
。这意味着我将处理甚至“捕获”的异常,这是不切实际的

有什么想法吗

编辑:


我做了一个WPF应用程序,在这里我从主线程实例化COM对象。初始化后,会引发事件,并且我的事件处理程序在主线程上运行,但如果我引发异常,则不会使应用程序崩溃或引发
未处理的异常
事件。我真的不明白为什么在主线程上抛出的异常没有任何作用。

不清楚您想做什么。对象(COM或非COM)不能从您自己的事件处理程序内部引发异常-您拥有处理程序中的代码,而不是对象。真正的例外来自哪里?在任何情况下:否,异常不能跨线程,句号。实际上,在该事件处理程序中抛出的异常必须在事件处理程序本身中处理(调用堆栈中处理程序上方的任何代码都不属于您)。那么,告诉主线程存在问题的正确方法是什么呢?感谢您的观察,这很正常,COM不允许异常跨越语言障碍。非常必要,异常是语言运行时实现的细节。因此,CLR将始终捕获您抛出的任何异常,并将其转换为HRESULT错误代码,传递回COM服务器。如何处理该错误完全取决于该服务器。当然,不要期望什么,举办一个活动通常被视为“最大努力”。你无法改变它。你可以打电话给COM开发人员,但一定要得到一个“不要那样做”的回答。你想做什么还不清楚。对象(COM或非COM)不能从您自己的事件处理程序内部引发异常-您拥有处理程序中的代码,而不是对象。真正的例外来自哪里?在任何情况下:否,异常不能跨线程,句号。实际上,在该事件处理程序中抛出的异常必须在事件处理程序本身中处理(调用堆栈中处理程序上方的任何代码都不属于您)。那么,告诉主线程存在问题的正确方法是什么呢?感谢您的观察,这很正常,COM不允许异常跨越语言障碍。非常必要,异常是语言运行时实现的细节。因此,CLR将始终捕获您抛出的任何异常,并将其转换为HRESULT错误代码,传递回COM服务器。如何处理该错误完全取决于该服务器。当然,不要期望什么,举办一个活动通常被视为“最大努力”。你无法改变它。你可以打电话给COM开发人员,但一定要得到“不要那样做”的回答。