2016-09-15 118 views
1

我期待在例如https://developer.xamarin.com/samples/mac/NSPortExample/CFMessagePort未收到消息

我试图重新创建的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(); 
     } 
    } 

回答

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

+0

谢谢SusjiHangover,缺少CFRunLoop.ModeCommon是解决方案。希望我可以给一个以上的! – thaDanzar