2011-02-07 41 views
3

此代碼一個TextView它不工作MonoTouch的BackgroundWorker的調用不工作

btnUpload.TouchDown += delegate 
      {    
       BackgroundWorker bw = new BackgroundWorker(); 

       bw.DoWork += delegate(object sender, DoWorkEventArgs e) { 
        DoUpload(); 
       }; 

       bw.RunWorkerAsync(); 

       bw.RunWorkerCompleted += delegate(object sender3, RunWorkerCompletedEventArgs e3) 
       { 
        Console.WriteLine("Uploades"); 
        txtUploadStatus.Text = "Uploaded"; 
             } 

       }; 

      }; 

如果我刪除txtUploadStatus.Text它作爲spected,它是一個UITextView

堆棧跟蹤是

2011-02-07 12:49:40.645 PruebaGData[3476:940f] bool _WebTryThreadLock(bool), 0x4a6fd30: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 
Stacktrace: 

    at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr (intptr,intptr,intptr) <0xffffffff> 
    at MonoTouch.UIKit.UITextView.set_Text (string) <0x000e8> 
    at PruebaGData.AppDelegate.<FinishedLaunching>m__4 (object,System.ComponentModel.RunWorkerCompletedEventArgs) [0x0000a] in /Users/Alex/Projects/PruebaGData/PruebaGData/Main.cs:79 
    at System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted (System.ComponentModel.RunWorkerCompletedEventArgs) <0x00043> 
    at System.ComponentModel.BackgroundWorker.<CompleteWorker>m__1 (object) <0x0007b> 
    at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0x000cb> 

Native stacktrace: 

    0 PruebaGData       0x0060c9e0 mono_handle_native_sigsegv + 404 
    1 PruebaGData       0x005f60b8 mono_sigsegv_signal_handler + 348 
    2 libSystem.B.dylib     0x311dcddf _sigtramp + 42 
    3 WebCore        0x33ced821 _ZL17_WebTryThreadLockb + 156 
    4 WebCore        0x33ced76f WebThreadLock + 46 
    5 UIKit        0x339f71a1 -[UITextView setText:] + 16 
    6 PruebaGData       0x0004f0b8 (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend_IntPtr (intptr,intptr,intptr) + 80 
    7 PruebaGData       0x000187cc PruebaGData.AppDelegate:<FinishedLaunching>m__4 (object,System.ComponentModel.RunWorkerCompletedEventArgs) + 232 
    8 PruebaGData       0x00084094 System.ComponentModel.BackgroundWorker:OnRunWorkerCompleted (System.ComponentModel.RunWorkerCompletedEventArgs) + 68 
    9 PruebaGData       0x00084120 System.ComponentModel.BackgroundWorker:<CompleteWorker>m__1 (object) + 124 
    10 PruebaGData       0x0039e6f0 (wrapper runtime-invoke) object:runtime_invoke_dynamic (intptr,intptr,intptr,intptr) + 204 
    11 PruebaGData       0x005f5d30 mono_jit_runtime_invoke + 3032 
    12 PruebaGData       0x006d4b80 mono_runtime_invoke + 140 
    13 PruebaGData       0x006d7770 mono_runtime_invoke_array + 2068 
    14 PruebaGData       0x006db444 mono_message_invoke + 640 
    15 PruebaGData       0x006f8320 mono_async_invoke + 212 
    16 PruebaGData       0x006fa5cc async_invoke_thread + 400 
    17 PruebaGData       0x006fc964 start_wrapper + 656 
    18 PruebaGData       0x00722048 thread_start_routine + 240 
    19 PruebaGData       0x00751054 GC_start_routine + 132 
    20 libSystem.B.dylib     0x311df88d _pthread_start + 248 
    21 libSystem.B.dylib     0x311d4a90 thread_assign_default + 4294967295 

================================================================= 
Got a SIGSEGV while executing native code. This usually indicates 
a fatal error in the mono runtime or one of the native libraries 
used by your application. 
================================================================= 

那麼,怎樣才能我稱之爲從bw.RunWorkerCompleted的UI元素???

回答

8

要修改過的UI線程的UI元素。

更改RunWorkerCompleted到:

 bw.RunWorkerCompleted += (s, e) => { 
     txtUploadStatus.InvokeOnMainThread (delegate { 
        Console.WriteLine("Uploades"); 
        txtUploadStatus.Text = "Uploaded"; 
     }); 
    }; 
1

BackgroundWorker時將使用的開始處理完成事件它得到SynchronizationContext。如果在後臺線程的TouchDown事件觸發,那麼上下文將不適合與UIKit的使用。