2013-02-21 73 views
0

在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) 

回答

3

兩個Xamarin.iOS和Xamarin.Android的GUI線程設置SynchronizationContext

這意味着你從GUI線程得到SynchronizationContext.Current並將它傳遞給你的回調(例如通過國家被攝體或拍攝拉姆達)。然後,您可以使用上下文的Post方法在主線程上調用事物。

例如:

//don't inline this into the callback, we need to get it from the GUI thread 
var ctx = SynchronizationContext.Current; 

IAsyncResult result = request.BeginGetResponse(o => { 
    // calculate stuff on the background thread 
    var loginInfo = GetLoginInfo (o); 
    // send it to the GUI thread 
    ctx.Post (_ => { ShowInGui (loginInfo); }, null); 
}, state); 
+0

感謝您的回覆。看起來這是我正在尋找的東西。你可以給我一個例子,上下文是通過'state'變量傳遞的。現在它抱怨GetLoginInfo無法找到。 ''ShowInGui''我認爲你的意思是'onLogin' – Sunkas 2013-02-25 16:00:44

+0

Right,GetLoginInfo和ShowInGui只是代表你想要在GUI線程中運行的後臺線程和代碼的代碼。 – 2013-02-25 23:11:49

+0

通過狀態對象傳遞上下文很容易。您可以將任何狀態對象傳遞給BeginGetResponse,並且您的回調可以從IAsyncResult的AsyncState屬性中獲取。所以你可以通過這種方式將數據傳遞給你的回調。這是一個從匿名代表和lambda進入之前的舊模式。 – 2013-02-25 23:14:28

0

我不知道這是否適用於單聲道,但我通常做這在WinForm的應用程序。假設您想要執行方法X()。然後:

public void ResponseFinished() { 
    InvokeSafe(() => X()); //Instead of just X(); 
} 

public void InvokeSafe(MethodInvoker m) { 
    if (InvokeRequired) { 
     BeginInvoke(m); 
    } else { 
     m.Invoke(); 
    } 
} 

當然,這是在Form類中。

+0

Form類?我應該輸入什麼? 「使用System.Threading」沒有幫助。它可以找到任何MethodInvoker,InvokeRequired,BeginInvoke或Invoke。 – Sunkas 2013-02-21 08:55:45

+0

不要認爲這將在單聲道/ .net 2.0中工作 – Sunkas 2013-02-21 09:05:00