3

数週間遅れましたが、ようやく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

4

2 に答える 2

6

this.UserName.Textとthis.Password.TextをInvokeOnMainThreadデリゲートでラップします。Monotouchは、UI要素のすべての作業がUIスレッドで実行されることを想定しています。

于 2012-12-01T03:39:15.353 に答える
3

この機能は、 MonoTouch 5.4で少し前に導入されました(新しいライブラリ機能、クロススレッドUIチェックを参照)。

現在、これはスレッドの変更ではなく(コードは以前と同じように実行されます)、一般的な落とし穴について人々に警告するための追加のチェックです。これは、デバッグが非常に難しいことがよくあります。

古い動作を元に戻したい場合の手順があります。ただし、現在のコードが壊れていることに注意してください。99%の確率で機能する可能性がありますが、一部の人にとってはひどく壊れることがあります(たとえば、このような問題はタイミングに依存することが多く、コードを変更したり、別のデバイスを使用したりすると問題が発生する可能性があります)。

そのため、ベンが説明したように、問題を見つけたら修正することを強くお勧めします(ユーザーはそれを気に入ってくれるでしょう;-)。

于 2012-12-01T15:12:40.137 に答える