[英]Exception message thrown from C++/CX async method consumed in C# app
我正在编写针对Windows 8.1的C ++ / CX WinRT库,我想从C#应用程序中使用它。
如果我从异步方法抛出异常,则C#应用程序中显示的异常消息是错误的。
在WinRT库中,我有C ++ / CX代码,例如:
IAsyncOperation<int>^ test()
{
return create_async([]() -> int
{
throw ref new Platform::Exception(E_POINTER, "My message.");
});
}
在C#应用中,我的代码如下:
try
{
await c.test();
}
catch (Exception ex)
{
Debug.WriteLine("Exception message: {0}", ex.Message);
}
调试模式下的输出为:
WinRT information: My message.
First-chance exception at 0x77692C1A in App1.exe: Microsoft C++ exception: Platform::Exception ^ at memory location 0x09A5E434. HRESULT:0x80004003 Invalid pointer
WinRT information: My message.
A first chance exception of type 'System.NullReferenceException' occurred in mscorlib.dll
Exception message: Object reference not set to an instance of an object.
我知道这个问题 。 但是,这对于Windows 8.1应用程序已解决。 我成功地从非异步方法传递了异常消息,但是我无法使它在异步环境下工作。 谁能帮我这个忙吗?
如果它是异步的,则意味着函数c.test()在另一个线程中执行,该线程只能捕获其自身的异常,因此您的代码将无法工作。
可以使用返回代码来代替使用异常。 同样在此MSDN文章: 异步编程最佳实践中 ,它谈论的第一件事是:避免异步无效。
按照MSDN( https://msdn.microsoft.com/en-us/library/Hh750082.aspx )
仅当必须创建可以从另一种语言或其他Windows运行时组件访问的功能时,才使用create_async。 当您知道该操作是由同一组件中的C ++>代码产生和使用的时,请直接使用任务类>>。
摘要:当create_async
要被另一种语言使用时,请使用它。 由c ++占用时使用create_task
。
希望这可以帮助=)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.