1

私はC#WindowsPhoneプログラミングをするのは初めてです。

一言で言えば、私は現在、次のようなアプリを構築しています。

ロードimage A

ロードimage B

次にロードしますimage C

次に、これら3つの画像を使用して、後処理を行います。

私のイメージBとイメージCはContent、プロジェクト内と同じようにビルドされます。画像Aはギャラリーから選択されるか、カメラを介して撮影されます。または、画像Aが分離ストレージからロードされていると単純に想定できます。

非同期画像の読み込みが原因と思われる問題が発生しています。

これが私のコードです:

...
// I intend to load the 3 pictures by calling the method: LoadImage(int id) and LoadCImage();

            else if (ListBox.SelectedIndex == 0)
            {
                Debug.WriteLine("Selected 0");
                PhotoProcessor pp = new PhotoProcessor();
                WriteableBitmap imageA = new WriteableBitmap(AImage);
                WriteableBitmap imageB = LoadImage(0);
                WriteableBitmap imageC = LoadCImage();
                WriteableBitmap mix = pp.Mix(pp.CalcAverageColour(0), imageA, imageB, imageC);
                resultPic.Source = mix;
            }
...

と:

private WriteableBitmap LoadImage(int id)
        {
            //String uriString = "/Assets/img0.jpg";            
            //BitmapImage img = new BitmapImage(new Uri(uriString, UriKind.Relative));
            BitmapImage img = new BitmapImage();
            img.CreateOptions = BitmapCreateOptions.None;
            //img.SetSource(Application.GetResourceStream(new Uri("/Assets/facetemplate0.jpg", UriKind.Relative)).Stream);
            img.UriSource = new Uri("/Assets/img" + id + ".jpg", UriKind.Relative);

            //img.UriSource = new Uri(uriString, UriKind.Relative);
            return new WriteableBitmap(img);
        }

        private WriteableBitmap LoadCImage()
        {
            //BitmapImage img = new BitmapImage(new Uri("/Assets/imgC.jpg", UriKind.Relative));
            BitmapImage bmp = new BitmapImage();
            bmp.CreateOptions = BitmapCreateOptions.None;
            //img.SetSource(Application.GetResourceStream(new Uri("/Assets/imgC.jpg", UriKind.Relative)).Stream);
            bmp.UriSource = new Uri("/Assets/imgC.jpg", UriKind.Relative);
            return new WriteableBitmap(bmp);
        }

今私の質問は:

このコードを実行しようとすると、Null参照例外がスローされます。これは、関数mixが画像ABおよびCを読み込めないためです(この画像の読み込みは非同期です)。

mixこれらの画像を順番に読み込んでから関数に渡す方法があるのでしょうか。

私が試したこと:

  1. このすばらしいブログ投稿をチェックすることで、画像を同期的にロードする方法があることがわかりますが、コード全体でわかるように、ブログ投稿のように使用しようとしましSetSource(stream)たが、残念ながら同じNullリファレンスを取得しました例外。

  2. 私もそのEventHandler方法を考えましたが、この場合は良い考えではないと思います。実装EventHandlerすると、(擬似コード)のようになりますか?

    imageA_Opened()
    {
    LoadImageB += imageB_Opened();
    }
    
    imageB_Opened()
    {
     LoadImageC += imageC_Opened();
    }
    
    imageC_Opened()
    {
    PhotoProcessor pp = new PhotoProcessor();
    pp.Mix(averageColour, A, B, C);
    }
    

私は正しいですか?

4

2 に答える 2

2

同期呼び出しで UI をブロックすべきではないという点で、Servy は正しいです。

そうは言っても、WP7 アプリでも同様の要件がありました。「Async CTP」を使用して、次の呼び出しを行う前に完了するまで待機する同期のような関数を作成する機能を追加しました。以前の呼び出しからのデータが正しく機能するために必要な API 呼び出しがありました。

これは .NET 4.5 に含まれており、WP8 で動作すると思います。

http://msdn.microsoft.com/en-ca/library/vstudio/hh191443.aspx

アプリのデータをプルするために私が書いたものを次に示します (「async」および「await」キーワードに注意してください)。

public async Task<bool> GetDefaultData()
{
    try
    {
        _cancellation = new CancellationTokenSource();

        UpdateProgress(DateTime.Now + ": Download Started.\n");
        List<string> data = await App._apiConnection.DoWorkAsync(_cancellation.Token, ApiInfo.GetBaseDataUriList());
        App._apiConnection.Done(data);

        UpdateProgress(DateTime.Now + ": Countries: " + App._context.Countries.Count() + "\n");
        UpdateProgress(DateTime.Now + ": Regions: " + App._context.Regions.Count() + "\n");
        UpdateProgress(DateTime.Now + ": Income Levels: " + App._context.IncomeLevels.Count() + "\n");
        UpdateProgress(DateTime.Now + ": Indicators: " + App._context.Indicators.Count() + "\n");

        data = await App._apiConnection.DoWorkAsync(_cancellation.Token, ApiInfo.GetCountryUriList("CA"));
        App._apiConnection.Done(data);
        UpdateProgress(DateTime.Now + ": CA Population: " + App._context.PopulationDatas.Count(c => c.Country.Iso2Code == "CA") + "\n");

        data = await App._apiConnection.DoWorkAsync(_cancellation.Token, ApiInfo.GetCountryUriList("US"));
        App._apiConnection.Done(data);
        UpdateProgress(DateTime.Now + ": US Population: " + App._context.PopulationDatas.Count(c => c.Country.Iso2Code == "US") + "\n");

        data = await App._apiConnection.DoWorkAsync(_cancellation.Token, ApiInfo.GetCountryUriList("CN"));
        App._apiConnection.Done(data);
        UpdateProgress(DateTime.Now + ": CN Population: " + App._context.PopulationDatas.Count(c => c.Country.Iso2Code == "CN") + "\n");

        return true;
    }
    catch (OperationCanceledException)
    {
        MessageBox.Show("Operation Cancelled");
        return false;



    }
    catch (Exception ex)
    {
        MessageBox.Show("getDefaultData Exception: " + ex.Message);

        return false;
    }
}
于 2012-12-13T15:01:25.223 に答える
0

画像を順番にダウンロードすることはできません。確かに開発は簡単ですが、プロセッサを長期間ブロックしてアプリケーションをフリーズさせるため、それほど効果的ではありません。

EventHandler メソッドについても考えましたが、この場合は良い考えではないと思います。EventHandler を実装すると、次のようになります (疑似コード):

ええ、あなたが説明したように、それはその一般的なパターンに従います。これが、この問題に対処する適切な方法です。

于 2012-12-06T16:41:05.297 に答える