CFMessagePort未收到消息

时间:2016-09-15 13:11:35

标签: macos xamarin xamarin.mac

我正在查看示例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();
        }
    }

1 个答案:

答案 0 :(得分:2)

确保通过kCFRunLoopCommonModes

设置CFRunLoop.ModeCommon
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,只是将其设置为隐藏。