在UI線程中調用方法從背景我使用MonoDevelop的(.NET 2.0)開發iOS和Android應用程序。我使用BeginGetResponse和EndGetResponse在後臺線程中異步執行webrequest。在.NET 2.0
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(onLogin), state);
然而,回調onLogin
似乎仍然可以在後臺線程運行的,沒有讓我與UI交互。我該如何解決這個問題?
可以看到,有Android和iOS的具體解決方案,但希望有一個跨平臺的解決方案。
編輯:從mhutch答案,我走了這麼遠:
IAsyncResult result = request.BeginGetResponse(o => {
state.context.Post(() => { onLogin(o); });
}, state);
如果狀態包含類型的context
可變SynchronizationContext
設置爲SynchronizationContext.Current
它抱怨後,需要兩個參數,第二個是Object state
。插入state
給出了錯誤
Argument `#1' cannot convert `anonymous method' expression to type `System.Threading.SendOrPostCallback' (CS1503) (Core.Droid)
感謝您的回覆。看起來這是我正在尋找的東西。你可以給我一個例子,上下文是通過'state'變量傳遞的。現在它抱怨GetLoginInfo無法找到。 ''ShowInGui''我認爲你的意思是'onLogin' – Sunkas 2013-02-25 16:00:44
Right,GetLoginInfo和ShowInGui只是代表你想要在GUI線程中運行的後臺線程和代碼的代碼。 – 2013-02-25 23:11:49
通過狀態對象傳遞上下文很容易。您可以將任何狀態對象傳遞給BeginGetResponse,並且您的回調可以從IAsyncResult的AsyncState屬性中獲取。所以你可以通過這種方式將數據傳遞給你的回調。這是一個從匿名代表和lambda進入之前的舊模式。 – 2013-02-25 23:14:28