2016-09-15 2 views
1

je regarde par exemple https://developer.xamarin.com/samples/mac/NSPortExample/CFMessagePort ne reçoit pas les messages

Je suis en train de recréer le code Obj-C en C#, mais je ne pas avoir de succès. Ci-dessous est ma version simple de l'Obj-C, quelqu'un peut-il me dire ce que je fais mal, s'il vous plaît.

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(); 
     } 
    } 

Répondre

2

Assurez-vous de régler la kCFRunLoopCommonModes via 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); 
} 

Note: Aussi, vous ne devriez pas exécuter une boucle de spin, vous permet de bloquer la boucle d'exécution du port. Vous pouvez le mettre sur un autre thread et effectuer une attente sur le fil ... Personnellement, lorsque vous créez des applications "Cocca cmd line", j'utilise toujours la fenêtre/ViewController, juste en le mettant à caché.

+0

Merci SusjiHangover, le CFRunLoop.ModeCommon manquant était la solution. J'aimerais pouvoir donner plus d'une place! – thaDanzar