1

System.Threading.Task を使用して画像を読み込んで表示しようとすると問題が発生します

私のコードは次のとおりです

    Task DownloadTask { get; set; }

    public string Instrument { get; set; }

    public PriceChartViewController(string Instrument) {
        this.Instrument = Instrument;
        DownloadTask = Task.Factory.StartNew(() => { });
    }


    private void LoadChart(ChartType chartType) {
        NSData data = new NSData();

        DownloadTask = DownloadTask.ContinueWith(prevTask => {
            try {
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;

                NSUrl nsUrl = new NSUrl(chartType.Uri(Instrument));
                data = NSData.FromUrl(nsUrl);
            }
            finally {
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
            }
        });

        DownloadTask = DownloadTask.ContinueWith(t => {
            UIImage image = new UIImage(data);

            chartImageView = new UIImageView(image);
            chartImageView.ContentScaleFactor = 2f;

            View.AddSubview(chartImageView);

            this.Title = chartType.Title;
        }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
    }

2 つ目の Continue with が呼び出されていないようです。

最初、私のコードはバックグラウンド処理なしで次のようになり、完全に機能しました。

    private void oldLoadChart(ChartType chartType) {

        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;

        NSUrl nsUrl = new NSUrl(chartType.Uri(Instrument));
        NSData data = NSData.FromUrl(nsUrl);
        UIImage image = new UIImage(data);

        chartImageView = new UIImageView(image);
        chartImageView.ContentScaleFactor = 2f;

        View.AddSubview(chartImageView);

        this.Title = chartType.Title;

        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
    }

私が間違っていることを誰かが知っていますか?

4

2 に答える 2

2

スレッドの最初の部分がクラッシュしているため、2 番目の部分に到達することはありません UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true; 。非 UI スレッドから呼び出しています。ネットワーク アクティビティ インジケータの設定は UI 操作であり、メイン スレッドでのみ実行できます。で包む必要がありますInvokeOnMainThread()。try-catch を追加すると、例外が表示されます。

于 2012-10-15T18:30:34.280 に答える
0

catchの前に追加しfinallyます。たぶん、例外があり、ワークフローがそれ以上進みません。

于 2012-10-15T11:10:42.650 に答える