2014-07-08 41 views
1

我在Xamarin.Mac目前有很多困難。Xamarin.Mac事件和線程似乎不能一起工作

基本上我想要做的就是POST和從Web服務器獲取一些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的本地實現。

現在,這是我發現自己的situaiton: 如果我有傳遞給它一個匿名函數NSURLConnection的異步請求,如果我採取了它的工作原理永遠點擊 後單擊並調用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 

任何人有什麼想法?我很難過。

感謝

+0

我有類似的問題。我的輸出錯誤看起來完全一樣...我仍然沒有解決如何解決它;-) – Humphrey

回答

0

所以撓頭了幾個小時之後我似乎已經在整個解決方案絆倒了。

從早期我就懷疑這與垃圾收集有關,或者在第三次點擊按鈕之後碰到任何代碼之前應用程序崩潰,並且從閱讀其他堆棧溢出Xamarin/OS X的問題,我的症狀聽起來很像一個過分渴望的垃圾收集器。

所以起初我以爲每次我從Web服務器獲得響應時都會引發一個事件,並且事件已經冒泡到ViewModel,所以本質上是將其冒泡給OSX項目中的ViewController。其目的是嘗試使用此事件重新綁定每次點擊後的按鈕綁定 - 但我試着用空的事件處理程序運行它,並且我發現它修復了最初的問題!

儘管事實上ViewController已經通過this.ViewModel引用了ViewModel,但看起來OS X/XamMac正在過度渴望和處置ViewModel,因此將App引入了它的膝蓋。有趣的是,我只發現添加和處理一個事件來解決這個問題,試圖將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); 
      } 
     } 

,並在Mac OS X的身邊,我已將此添加到viewDidLoad中的視圖控制器:

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

然後創建一個空函數來處理這個問題:

private void GoCommandFinished(object sender, EventArgs e){ 

     } 

和volia!我有興趣知道一個更清晰的方法來整理這件事,因爲這對我來說非常難以理解......但現在,我不在乎,它的工作原理!但是如果Xamarin的任何人都能解釋如何更加優雅地冷靜垃圾收集,那會很棒!

謝謝

+0

有趣的是,這個修復也無需我的MacHttpHelper - 標準的.NET WebClient代碼現在可以正常工作... – britcowboy