1

目前,我在使用 Xamarin.Mac 时遇到了很多困难。

基本上我想做的就是向/从网络服务器发布和抓取一些 JSON,然后调用一个事件,该事件通过委托冒泡到(最终将是一个)UI 更改事件(目前它只是一个 debug.writeline称呼)。

我有两个 PCL 库,一个是“核心”,另一个是核心引用库,还有一个 WPF 应用程序和一个 OS X 应用程序 - WPF 应用程序工作正常。我也在使用 MVVMCross。

起初,我尝试使用一个使用 HTTPWebRequest 的预先存在的类,并且对于第一个按钮单击(触发此调用)它工作正常。在第二个按钮上单击 OS X 应用程序崩溃。我尝试切换到 HttpClient,没有骰子。

阅读此线程后:https : //bugzilla.xamarin.com/show_bug.cgi?id=19906 我尝试使用接口将 OS X 应用程序的 HTTP 类切换到 NSUrlConnection 的本机实现。

现在这是我发现自己的情况:如果我有一个 NSUrlConnection ASync 请求并传递给它一个匿名函数,它会在点击后永远工作如果我把它拿出来并调用一个 FireEvent() 函数,它只会引发事件(这可能会引发更多事件链)然后它永远有效,单击后单击如果我同时具有具有匿名功能的异步和 FireEvent,则在第三次单击触发此功能的按钮时,它会引发本机崩溃。

如果我取出所有异步的东西,它会正常工作,但这并不理想。

有任何想法吗?我无计可施。

        public void ExecuteAsync() 
    {
        var request = new NSUrlRequest(new NSUrl("http://www.example.com"));

        asyncRunning = true;

        NSUrlConnection.SendAsynchronousRequest(request, NSOperationQueue.MainQueue, delegate(NSUrlResponse response, NSData data, NSError error) {

        var responseStr = data.ToString();

            var blah = new HttpResponseCompleteEventArgs("{TESTJSONThatIveRemovedForReadability}");

            System.Diagnostics.Debug.WriteLine("Inside IsMainThread: " + NSThread.IsMain.ToString());

            response.InvokeOnMainThread ( delegate {
                FireEvent(blah);
                System.Diagnostics.Debug.WriteLine("Inside IsMainThread invoke: " + NSThread.IsMain.ToString());
            });



        });

        System.Diagnostics.Debug.WriteLine("Outside IsMainThread: " + NSThread.IsMain.ToString());


    }

和崩溃

Stacktrace:

  at <unknown> <0xffffffff>
  at (wrapper managed-to-native) MonoMac.AppKit.NSApplication.NSApplicationMain (int,string[]) <IL 0x0009d, 0xffffffff>
  at MonoMac.AppKit.NSApplication.Main (string[]) [0x00041] in /Users/builder/data/lanes/xamcore-lion-1.8-branch/b8b75fd4/source/xamcore/src/AppKit/NSApplication.cs:105
  at FreshlySqueezed.Mac.MainClass.Main (string[]) [0x00007] in /Users/blah/Development/Development/FreshlySqueezed/FreshlySqueezed.Mac/Main.cs:14
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

Native stacktrace:


Debug info from gdb:

^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
^D
quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quit

^D
quProcess 2693 stopped
* thread #1: tid = 0x1e2f7, 0x91b0cfed libsystem_kernel.dylib`__wait4 + 5, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  thread #2: tid = 0x1e30e, 0x91b0d992 libsystem_kernel.dylib`kevent64 + 10, queue = 'com.apple.libdispatch-manager'
  thread #3: tid = 0x1e30f, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
  thread #4: tid = 0x1e310, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
  thread #5: tid = 0x1e311, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
  thread #6: tid = 0x1e314, 0x91b07fb6 libsystem_kernel.dylib`semaphore_wait_trap + 10
  thread #7: tid = 0x1e315, 0x91b0ca26 libsystem_kernel.dylib`__recvfrom + 10
  thread #8: tid = 0x1e32c, 0x91b07f7a libsystem_kernel.dylib`mach_msg_trap + 10
  thread #9: tid = 0x1e32e, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
(lldb) quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit

quit^D
qu* thread #1: tid = 0x1e2f7, 0x91b0cfed libsystem_kernel.dylib`__wait4 + 5, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x91b0cfed libsystem_kernel.dylib`__wait4 + 5
    frame #1: 0x92c46ec5 libsystem_c.dylib`waitpid$UNIX2003 + 48
    frame #2: 0x018ab5f9 libmono-2.0.dylib`mono_handle_native_sigsegv(signal=11, ctx=0x006e1fe0) + 489 at mini-exceptions.c:2305
    frame #3: 0x018fd9d5 libmono-2.0.dylib`mono_arch_handle_altstack_exception(sigctx=0x006e1fe0, fault_addr=0x608962a8, stack_ovf=0) + 149 at exceptions-x86.c:1170
    frame #4: 0x01804351 libmono-2.0.dylib`mono_sigsegv_signal_handler(_dummy=11, info=0x006e1fa0, context=0x006e1fe0) + 369 at mini.c:6842
    frame #5: 0x94fd1deb libsystem_platform.dylib`_sigtramp + 43

  thread #2: tid = 0x1e30e, 0x91b0d992 libsystem_kernel.dylib`kevent64 + 10, queue = 'com.apple.libdispatch-manager'
    frame #0: 0x91b0d992 libsystem_kernel.dylib`kevent64 + 10
    frame #1: 0x9a415899 libdispatch.dylib`_dispatch_mgr_invoke + 238
    frame #2: 0x9a415532 libdispatch.dylib`_dispatch_mgr_thread + 52

  thread #3: tid = 0x1e30f, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #0: 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #1: 0x91cfbdcf libsystem_pthread.dylib`_pthread_wqthread + 372

  thread #4: tid = 0x1e310, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #0: 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #1: 0x91cfbdcf libsystem_pthread.dylib`_pthread_wqthread + 372

  thread #5: tid = 0x1e311, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #0: 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #1: 0x91cfbdcf libsystem_pthread.dylib`_pthread_wqthread + 372

  thread #6: tid = 0x1e314, 0x91b07fb6 libsystem_kernel.dylib`semaphore_wait_trap + 10
    frame #0: 0x91b07fb6 libsystem_kernel.dylib`semaphore_wait_trap + 10
    frame #1: 0x01a1891e libmono-2.0.dylib`mono_sem_wait(sem=<unavailable>, alertable=<unavailable>, sem=0x01b1ac20, alertable=1) + 30 at mono-semaphore.c:121
    frame #2: 0x019c43ea libmono-2.0.dylib`finalizer_thread(unused=0x00000000) + 74 at gc.c:1073
    frame #3: 0x0199c654 libmono-2.0.dylib`start_wrapper [inlined] start_wrapper_internal(data=0x00193bd0) + 442 at threads.c:647
    frame #4: 0x0199c49a libmono-2.0.dylib`start_wrapper(data=0x00193bd0) + 26 at threads.c:692
    frame #5: 0x01a1de1d libmono-2.0.dylib`inner_start_thread(arg=0xbffff2c0) + 253 at mono-threads-posix.c:94
    frame #6: 0x01a3eebd libmono-2.0.dylib`GC_start_routine(arg=0x006e2f60) + 93 at pthread_support.c:1502
    frame #7: 0x91cfa5fb libsystem_pthread.dylib`_pthread_body + 144
    frame #8: 0x91cfa485 libsystem_pthread.dylib`_pthread_start + 130

  thread #7: tid = 0x1e315, 0x91b0ca26 libsystem_kernel.dylib`__recvfrom + 10
    frame #0: 0x91b0ca26 libsystem_kernel.dylib`__recvfrom + 10
    frame #1: 0x92c470c9 libsystem_c.dylib`recv$UNIX2003 + 54
    frame #2: 0x018d58c0 libmono-2.0.dylib`socket_transport_recv(buf=0xb039aeed, len=11) + 160 at debugger-agent.c:1085
    frame #3: 0x018d1c8d libmono-2.0.dylib`debugger_thread(arg=0x00000000) + 21485 at debugger-agent.c:1475
    frame #4: 0x01a1de1d libmono-2.0.dylib`inner_start_thread(arg=0xbffff2c0) + 253 at mono-threads-posix.c:94
    frame #5: 0x01a3eebd libmono-2.0.dylib`GC_start_routine(arg=0x006e2f60) + 93 at pthread_support.c:1502
    frame #6: 0x91cfa5fb libsystem_pthread.dylib`_pthread_body + 144
    frame #7: 0x91cfa485 libsystem_pthread.dylib`_pthread_start + 130

  thread #8: tid = 0x1e32c, 0x91b07f7a libsystem_kernel.dylib`mach_msg_trap + 10
    frame #0: 0x91b07f7a libsystem_kernel.dylib`mach_msg_trap + 10
    frame #1: 0x91b0716c libsystem_kernel.dylib`mach_msg + 68
    frame #2: 0x9bea0bf9 CoreFoundation`__CFRunLoopServiceMachPort + 169
    frame #3: 0x9bea01d1 CoreFoundation`__CFRunLoopRun + 1393
    frame #4: 0x9be9f9ea CoreFoundation`CFRunLoopRunSpecific + 394
    frame #5: 0x9be9f84b CoreFoundation`CFRunLoopRunInMode + 123
    frame #6: 0x90de9b88 AppKit`_NSEventThread + 283
    frame #7: 0x91cfa5fb libsystem_pthread.dylib`_pthread_body + 144
    frame #8: 0x91cfa485 libsystem_pthread.dylib`_pthread_start + 130

  thread #9: tid = 0x1e32e, 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #0: 0x91b0d046 libsystem_kernel.dylib`__workq_kernreturn + 10
    frame #1: 0x91cfbdcf libsystem_pthread.dylib`_pthread_wqthread + 372
Executing commands in '/tmp/mono-gdb-commands.J45EfM'.
(lldb)  process attach --pid 2693
Process 2693 stopped

有人知道吗?我难住了。

谢谢

4

1 回答 1

0

因此,经过数小时的挠头,我似乎偶然发现了解决方案。

从一开始,我就怀疑这与垃圾收集有关,或者由于应用程序在第三次点击按钮后我的任何代码被点击之前崩溃而失去绑定的事件,以及阅读 Xamarin/ 的其他 stackoverflow 问题在 OS X 上,我的症状听起来类似于过度渴望的垃圾收集器。

所以起初我以为每次我从网络服务器得到响应并且事件已经冒泡到 ViewModel 时我都会引发一个事件,所以本质上是把它冒泡到 OSX 项目中的 ViewController。目的是尝试使用此事件在每次单击后重新绑定按钮绑定 - 但是我尝试使用空的事件处理程序运行它,我发现它解决了最初的问题!

因此,尽管 ViewController 已经通过 this.ViewModel 引用了 ViewModel,但 OS X/XamMac 似乎过于急切地处理了 ViewModel,因此让应用程序陷入了困境。有趣的是,我只发现添加和处理一个事件来解决这个问题,试图将 this.ViewModel 分配给另一个类变量没有效果。

所以这是修复它的代码:

在视图模型中我添加了这个:

public event System.EventHandler GoCommandFinished;

public void CallbackFromWebRequest(SqueezeBase value){
                System.Diagnostics.Debug.WriteLine("hmmm");
            Hello = "whey?" + x;
            if (GoCommandFinished != null) {
                GoCommandFinished (null, null);
            }
        }

在 OS X 端的视图控制器中,我将其添加到 ViewDidLoad:

((FirstViewModel)this.ViewModel).GoCommandFinished += GoCommandFinished;

然后创建一个空函数来处理这个:

private void GoCommandFinished(object sender, EventArgs e){

        }

和沃利亚!我很想知道一种更清洁的方法来解决这个问题,因为这对我来说感觉很hacky......但现在,我不在乎,它有效!但是,如果 Xamarin 中的任何人都可以更优雅地解释如何让垃圾收集平静下来,那就太好了!

谢谢

于 2014-07-09T17:46:06.853 回答