数週間遅れましたが、ようやくMonoTouchiOSアプリを新しい6.0バージョンに更新できるようになりました。長時間実行されるアクティビティ(私のアプリケーションはバックグラウンドでサービス呼び出しを行い、画像のアップロードを行います)の場合、例と非常によく似たスレッドを使用します。私がアップグレードするまで、これはすべてうまくいきました。コントローラの一般的なパターンは次のようになります。
protected void LogInButtonClicked(object sender, EventArgs e)
{
NetworkActivity.Start();
// start the request.
ThreadPool.QueueUserWorkItem ((cb) => {
var service = new ClientUserService();
var result = service.Login(this.UserName.Text, this.Password.Text);
// when done, switch back to UI.
this.InvokeOnMainThread (() => {
NetworkActivity.Stop();
// do the various other things to init the app on the UI thread.
}
});
}
5.xでうまく機能し、クラッシュすることはありませんでした。そして、それは公開されたコードガイドラインに従った。しかし今、私はすぐにUUIKit整合性エラーの例外を受け取ります:あなたはUIスレッドからのみ呼び出すことができるUIKitメソッドを呼び出しています。これは、サービスコールライン(service.Login(...))で取得します。
だから...私はここで何が間違っているのか正確にはわかりません。私は戻って、新しいサンプルのいくつかを調べました。それらの一部はタスクライブラリ(たとえば、https://github.com/xamarin/mobile-samples/blob/master/MultiThreading/iOSMultiThreading/Screens/MainScreen_iPhone.cs)を使用していますが、このQueueUserWorkItemメソッドを排除するものではありません。
質問:Monotouchのスレッドモデルに重大な変更が加えられたため、上記のコーディングパターンはサポートされなくなりましたか?
ありがとう。JB