CFMessagePort 没有收到消息
CFMessagePort is not receiving the messages
我在看例子https://developer.xamarin.com/samples/mac/NSPortExample/
我正在尝试将 Obj-C 代码重新创建到 C# 中,但没有成功。
下面是我的 Obj-C 的简单版本,谁能告诉我我做错了什么。
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
var localPost = CFMessagePort.CreateLocalPort("com.example.app.port.server", HandleCFMessagePortCallBack, CFAllocator.Default);
CFRunLoopSource runSource = localPost.CreateRunLoopSource();
CFRunLoop.Current.AddSource(runSource, (NSString)string.Empty);
while(true){}
}
static NSData HandleCFMessagePortCallBack(int type, NSData data)
{
Console.WriteLine("Data:{0}",data);
return new NSData();
}
}
确保通过 CFRunLoop.ModeCommon
:
设置 kCFRunLoopCommonModes
static CFMessagePort localPort;
static void Main(string[] args)
{
NSApplication.Init();
localPort = CFMessagePort.CreateLocalPort("com.example.app.port.server", (int type, NSData data) =>
{
Console.WriteLine("Data:{0}", data);
return new NSData();
});
var runLoopSource = localPort.CreateRunLoopSource();
CFRunLoop.Current.AddSource(runLoopSource, CFRunLoop.ModeCommon);
NSApplication.Main(args);
}
注意:你也不应该执行自旋循环,你会阻塞端口的 运行 循环。您可以将它放在另一个线程上并在该线程上执行等待...就个人而言,在创建 "Cocca cmd line" 应用程序时,我仍然使用 Window/ViewController
,只是将其设置为隐藏。
我在看例子https://developer.xamarin.com/samples/mac/NSPortExample/
我正在尝试将 Obj-C 代码重新创建到 C# 中,但没有成功。
下面是我的 Obj-C 的简单版本,谁能告诉我我做错了什么。
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
var localPost = CFMessagePort.CreateLocalPort("com.example.app.port.server", HandleCFMessagePortCallBack, CFAllocator.Default);
CFRunLoopSource runSource = localPost.CreateRunLoopSource();
CFRunLoop.Current.AddSource(runSource, (NSString)string.Empty);
while(true){}
}
static NSData HandleCFMessagePortCallBack(int type, NSData data)
{
Console.WriteLine("Data:{0}",data);
return new NSData();
}
}
确保通过 CFRunLoop.ModeCommon
:
kCFRunLoopCommonModes
static CFMessagePort localPort;
static void Main(string[] args)
{
NSApplication.Init();
localPort = CFMessagePort.CreateLocalPort("com.example.app.port.server", (int type, NSData data) =>
{
Console.WriteLine("Data:{0}", data);
return new NSData();
});
var runLoopSource = localPort.CreateRunLoopSource();
CFRunLoop.Current.AddSource(runLoopSource, CFRunLoop.ModeCommon);
NSApplication.Main(args);
}
注意:你也不应该执行自旋循环,你会阻塞端口的 运行 循环。您可以将它放在另一个线程上并在该线程上执行等待...就个人而言,在创建 "Cocca cmd line" 应用程序时,我仍然使用 Window/ViewController
,只是将其设置为隐藏。