【发布时间】:2015-12-05 23:20:04
【问题描述】:
这是关于C++(不同平台的共享代码)与C#(Windows通用应用程序)之间的通信。我们知道下面是我们如何从C++ 到C# 进行函数调用。
C#
class FooCS
{
FooCS()
{
FooC c = new ref FooC();
c.m_GetSomeValueEvent = GetSomeValueEvent;
// Some other stuff ...
}
string GetSomeValueEvent()
{
// Some other stuff ...
return "Hello World";
}
}
C++
public delegate Platform::String GetSomeValueEventHandler();
class FooC
{
public:
event GetSomeValueEventHandler^ m_GetSomeValueEvent;
void someFunction(){
Platform::String^ str = m_GetSomeValueEvent();
// Some other stuff ...
}
}
以上内容非常简单。但问题是C#中的这个字符串GetSomeValueEvent()做了一些繁重的任务,比如从数据库中读取数据,我必须把它变成async。
async Task<string> GetSomeValueEvent() {
// Some other stuff ...
return "Hello World";
}
现在问题来了:如何让我的C++ 代码等待这个委托函数的返回?换句话说,下面的签名应该修改成什么?
public delegate Platform::String GetSomeValueEventHandler();
我一直在谷歌上搜索,找不到这个问题的正确术语。如果您确定这是不可能的,那么至少很高兴知道。
最终,这就是我们要做的:
string GetSomeValueEvent() {
// Convert a async method to non-async one
var val = someAsyncMethod().Result;
// Some other stuff ...
return "Hello World";
}
您必须确保GetSomeValueEvent 没有在主线程上运行以防止死锁。
【问题讨论】:
标签: c# windows asynchronous c++-cx