0

私はMonoDevelop(.net 2.0)を使用してiOSおよびAndroidアプリを開発しています。BeginGetResponseとEndGetResponseを使用して、バックグラウンドスレッドでWebリクエストを非同期的に実行します。

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タイプの変数が含まれている場合SynchronizationContextSynchronizationContext.Current

Postには2つの引数が必要であり、2番目の引数は。であると文句を言いObject stateます。挿入stateするとエラーが発生します

Argument `#1' cannot convert `anonymous method' expression to type `System.Threading.SendOrPostCallback' (CS1503) (Core.Droid)
4

2 に答える 2

2

Xamarin.iOSとXamarin.Androidの両方SynchronizationContextがGUIスレッドのを設定します。

これはSynchronizationContext.Current、GUIスレッドからを取得し、それをコールバックに渡すことを意味します(たとえば、状態オブジェクトを介して、またはラムダにキャプチャされます)。次に、コンテキストの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);
于 2013-02-22T17:07:53.587 に答える
0

これがMonoで機能するかどうかはわかりませんが、通常はWinFormアプリケーションで機能します。メソッドを実行したいとしますX()。それで:

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

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

もちろん、これはFormクラス内にあります。

于 2013-02-21T08:51:18.927 に答える