2011-03-24 60 views
1

我目前在Monotouch中使用WCF調用現有服務和自定義UIAlertView。Monotouch:UIAlertView和WCF服務,調試器.StackTrace

的問題是,如果我創建一個UIAlertView中的類的實例和我做了以下內容:

public override void ViewDidAppear() 
{ 
_alertView.Message = "Loading..."; 
_alertView.Show(); 

_client.GetDataAsync("test"); 
_client.GetDataCompleted += GetDataCompletedDelegate; 

base.ViewDidAppear(); 
} 

void GetDataCompletedDelegate(object sender, GetDataEventArgs) 
{ 
// do someting with data 
_alertView.Hide(); 
} 

它的工作原理,但這一建議被寫入控制檯:UIAlertView中:wait_fences:未能收到回覆: 10004003

否則,如果我嘗試運行此代碼:

public override void ViewDidAppear() 
{ 
using(CustomAV _alertView = new CustomAV()) 
{ 
    _alertView.Message = "Loading..."; 
    _alertView.Show(); 

    _client.GetDataAsync("test"); 
    _client.GetDataCompleted += delegate{ 
    InvokeOnMainThread(delegate{ 
     // do someting with data 
     _alertView.Hide(); 
    }); 
    }; 
} 

base.ViewDidAppear(); 
} 

第一次運行的代碼,但現在顯示警報。第二次模擬器無法啓動。 無法在引導服務器上註冊「com.yourcompany.wcftest」。錯誤:未知的錯誤代碼。這通常意味着這個過程的另一個實例已經運行或者掛在調試器中.StackTrace。在這種情況下,我必須重新啓動機器。

預先感謝您。

編輯:

謝謝傑夫,我檢查了我的代碼,進入GetDataCompletedDelegate我插入的UI線程中運行的功能。

InvokeOnMainThread(delegate{ 
doSomething(); 
}); 

private void doSomething() 
{ 
// do stuff here 
_alertView.Hide(); 
} 

繼續出現fency錯誤。如果我在doSomething()方法中使用你的解決方案,它可以工作

_alertView.InvokeOnMainThread(delegate{ 
_alertView.Hide(); 
}); 

爲什麼?也許我不明白,但是在代碼的第一部分中,某些()函數在UI線程中起作用!是不是真的?

+0

總是很好的做法是在主線程上對所有UI進行更改。因此,在'InvokeOnMainThread(delegate {})'中放置'_alertView.Show()'。這有時會導致不正常的行爲。它可能無法解決你的問題,但正如我所說,它可能是一些不尋常行爲的原因。 – Luke 2011-03-24 12:41:10

+0

謝謝盧克。事實是'_alertView.Show()'(在代碼的第二部分)正在主線程中運行,不是真的嗎? – 2011-03-24 13:34:17

+1

'_alertView.Hide()'是,但我看不到'.Show()'是...除非你的自定義類在主線程本身上運行它? – Luke 2011-03-24 14:07:17

回答

1

你在這裏有2個單獨的問題。

1:_alertView.Hide()是不是在UI線程上運行(這是什麼原因造成的圍欄錯誤)

2:在第二個例子中,你在創建後立即處置的UIAlertVeiw,但你有一個實例委託關閉它。這會以一種困難的方式崩潰運行時,然後當你再次運行它時,因爲舊的崩潰的進程仍在運行,模擬器不會讓你啓動第二個實例。使用案例#1,但_alterView.InvokeOnMainThread(委託{_alertView.Hide();}); _alterView.InvokeOnMainThread(委託{_alertView.Hide();});