0

在我的应用程序中,我有图像的 url 列表。我需要做的是下载这些图像并将它们保存在独立存储中。

我已经拥有的:

using (IsolatedStorageFile localFile = IsolatedStorageFile.GetUserStoreForApplication()) {
...
foreach (var item in MyList)
{
    Uri uri = new Uri(item.url, UriKind.Absolute);

    BitmapImage bitmap = new BitmapImage(uri);
    WriteableBitmap wb = new WriteableBitmap(bitmap);

    using (IsolatedStorageFileStream fs = localFile.CreateFile(GetFileName(item.url)))//escape file name
    {
        wb.SaveJpeg(fs, wb.PixelWidth, wb.PixelHeight, 0, 85);
    }
}
...
}

App.xaml.cs此代码已在我的文件中的函数内放置。我尝试了很多解决方案,在这个问题是“无效的跨线程访问”。

我怎样才能让它工作?

4

3 回答 3

0

@Mateusz Rogulski

您应该使用 WebClient,我建议您按照解决方案来解决您的问题。试试看嘛。

 public string YourMethod(string yoursUri)
 {
    BitmapImage image=new BitmapImage();
    WebClient client = new WebClient();
    client.OpenReadCompleted += async (o, args) =>
    {
        Stream stream = new MemoryStream();
        await args.Result.CopyToAsync(stream);
        image.SetSource(stream);
    };
    client.OpenReadAsync(new Uri(yoursUri));//if passing object than you can write myObj.yoursUri
    return image;
}

现在您有了图像,您可以在调用此函数的任何位置使用有效检查将其保存到您的 isolatedStorage

于 2013-12-03T06:10:50.017 回答
0

这个问题的解决方案是:

foreach (var item in MyList)
{
    Uri uri = new Uri(item.url, UriKind.Absolute);
    HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
    request.BeginGetResponse((ar) =>
    {
        var response = request.EndGetResponse(ar);
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            using (var stream = response.GetResponseStream())
            {
                var name = GetFileName(item.url);
                if (localFile.FileExists(name))
                {
                    localFile.DeleteFile(name);
                }
                using (IsolatedStorageFileStream fs = localFile.CreateFile(name))
                {
                    stream.CopyTo(fs);
                }
            }
        });
    }, null);
}
于 2013-09-29T21:54:47.960 回答
0

WriteableBitmap如果您在非 UI 线程上创建,您将获得无效的跨线程访问。使用以下命令确保该代码在主线程上运行Dispatcher

Deployment.Current.Dispatcher.BeginInvoke(() =>
    // ...
);
于 2013-09-27T19:08:46.883 回答