0

画像サービスを使用して bing マップから画像を取得していますが、アプリケーションが理由もなく終了することが時々ありましたが、画像サービスが mapuri リクエストのタイムアウトを処理していないことが原因であることがわかりました。

画像を取得:

    public static void GetBingMapImage(double longitude, double latitude, Size size, int zoomLevel, ImageryServiceParams imageResponseCallback)
    {
        var mapUriRequest = new MapUriRequest();
        var location = new GeocodeLocation { Latitude = latitude, Longitude = longitude };

        // Set credentials using a valid Bing Maps key
        mapUriRequest.Credentials = new Credentials();
        mapUriRequest.Credentials.ApplicationId = BingMapsKey;

        // Set the location of the requested image
        mapUriRequest.Center = new GeocodeLocation();
        mapUriRequest.Center.Latitude = location.Latitude;
        mapUriRequest.Center.Longitude = location.Longitude;

        mapUriRequest.Pushpins = new ObservableCollection<ImageryService.Pushpin>();
        mapUriRequest.Pushpins.Add(new ImageryService.Pushpin { Location = location, IconStyle = "10" });
        // Set the map style and zoom level
        var mapUriOptions = new MapUriOptions();
        mapUriOptions.Style = MapStyle.AerialWithLabels;
        mapUriOptions.ZoomLevel = zoomLevel;

        // Set the size of the requested image to match the size of the image control
        mapUriOptions.ImageSize = new SizeOfint();
        mapUriOptions.ImageSize.Height = Convert.ToInt16(size.Height);
        mapUriOptions.ImageSize.Width = Convert.ToInt16(size.Width);

        mapUriRequest.Options = mapUriOptions;

        var imageryService = new ImageryServiceClient("BasicHttpBinding_IImageryService");
        imageryService.GetMapUriCompleted += ImageryServiceGetMapUriCompleted;

        imageryService.GetMapUriAsync(mapUriRequest, imageResponseCallback);
    }

ここでの応答:

        public MyApplication.ImageryService.MapUriResponse EndGetMapUri(System.IAsyncResult result) {
            object[] _args = new object[0];
            MyApplication.ImageryService.MapUriResponse _result = ((MyApplication.ImageryService.MapUriResponse)(base.EndInvoke("GetMapUri", _args, result)));
            return _result;

例外:

「http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc」への HTTP リクエストが、割り当てられたタイムアウトの 00:01:00 を超えました。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

これは、リクエストの後にブレーク ポイントを設定し、そこで 1 分ほど待機することで簡単に再現できます。

この例外を処理するにはどうすればよいですか。このトピックに関連する解決策も質問も見つかりませんでした...

ここでもこの問題について話している: http://forums.create.msdn.com/forums/p/103502/616465.aspx#616465

前もって感謝します。

4

1 に答える 1

0

getImageryCompleted イベントで例外を処理すると、この問題が解決されたようです。

        private static void ImageryServiceGetMapUriCompleted(object sender, GetMapUriCompletedEventArgs e) 
        { 
// This is where you want to handle the timeout or web service errors.  This will prevent
// the error that the debugger stops on from getting back to the main thread and from your
// application having an UnhandledException.
try
{
            if (e.Result == null) return; 

            var imageryServiceParams = e.UserState as ImageryServiceParams; 
            if (imageryServiceParams != null) 
                imageryServiceParams.ImageResponseCallback.DynamicInvoke(new ImageryServiceResult(new Uri(e.Result.Uri, UriKind.Absolute)) { UserState = imageryServiceParams.UserState }); 
          }
catch
{
// The "MessageBox.Show is in a try/catch since it throws an exception if it is called when another
// MessageBox.Show is open. This was at least the case in Pre-Mango releases.
try { MessageBox.Show("Caught the TimeOut or WebException.  Application still running."); }
catch {}
}
于 2012-05-14T12:41:01.467 に答える