locked
非同期でのImageToolの例外 RRS feed

  • 質問

  • いつもお世話になっております。Samrilと申します。

    ImageToolを使い、Gifファイルを取得する際、次のようにWebからRSSなどの情報を取得後に、ImageToolでGifファイルを取得しようとすると、

    [System.ArgumentException] = {"Image has not been loaded."}が発生します。

            // コンストラクター
            public MainPage()
            {
                InitializeComponent();
                
                // なんでもいいので、いったんWebClientで非同期をおこなう
                WebClient client = new WebClient();
                client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
                client.DownloadStringAsync(new Uri("http://headlines.yahoo.co.jp/rss/rps_dom.xml", UriKind.Absolute));
            }
    
            void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                // 非同期処理で取得したデータにあるURIからGifファイルを取得したい
                ImageTools.IO.Decoders.AddDecoder<GifDecoder>();
                ExtendedImage exImage = new ExtendedImage();
                exImage.DownloadCompleted += (s, args) =>
                {
                    try
                    {
                        ExtendedImage i = s as ExtendedImage;
                        BitmapImage bitmap = new BitmapImage();
    
                        // 取得したはずのExtendedImage がうまいこと取れていない
                        bitmap.SetSource(i.ToStream());
                        image.Source = bitmap;
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }
                };
                // 今回のURIはテスト
                exImage.UriSource = new Uri("http://k.yimg.jp/images/top/sp/logo.gif", UriKind.Absolute);
            }
    


    どのようにして、この例外を解消すればよろしいでしょうか?

    よろしくお願いいたします。

     

     

    • 移動 Mike Wang (MSCS) 2012年10月2日 11:14 (移動元:Windows Phone 7 向けの開発)
    2012年1月30日 14:23

回答


  • DownloadCompleted では無くてLoadingCompletedを使うと良いと思います
    image.Source のセット時にcross-thread 例外が出る場合はDispatcher.BeginInvoke でuiスレッドで実行します 

     

                exImage.LoadingCompleted+= (s, args) =>
                {
                    try
                    {
                        this.Dispatcher.BeginInvoke(() =>
                        {
                            image.Source = exImage.ToBitmap();
                        });
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }
                };

     

    • 回答としてマーク Samril 2012年1月30日 15:21
    2012年1月30日 15:16

すべての返信


  • DownloadCompleted では無くてLoadingCompletedを使うと良いと思います
    image.Source のセット時にcross-thread 例外が出る場合はDispatcher.BeginInvoke でuiスレッドで実行します 

     

                exImage.LoadingCompleted+= (s, args) =>
                {
                    try
                    {
                        this.Dispatcher.BeginInvoke(() =>
                        {
                            image.Source = exImage.ToBitmap();
                        });
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }
                };

     

    • 回答としてマーク Samril 2012年1月30日 15:21
    2012年1月30日 15:16
  • Downloadではなく、Loadingが正解だったんですね!

    さらに、UIスレッドに戻しての処理も必要だったんですね。

    大変たすかりました、ありがとうございました^A^)/

     

    2012年1月30日 15:23