2016-09-15 115 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