RestSharp-下载/使用WPF/Silverlight中的图像

RestSharp-下载/使用WPF/Silverlight中的图像,wpf,image,silverlight,download,restsharp,Wpf,Image,Silverlight,Download,Restsharp,我正在尝试使用RestSharp从WCF/Rest服务下载图像。结果应保存在文件中,并显示在WPF/SL页面的图像控件中 private void GetImage() { RestClient _Client = new RestClient(BASE_URI); RestRequest request = new RestRequest("/api/img/{FileName}"); request.AddParameter("

我正在尝试使用RestSharp从WCF/Rest服务下载图像。结果应保存在文件中,并显示在WPF/SL页面的图像控件中

    private void GetImage()
    {
        RestClient _Client = new RestClient(BASE_URI);
        RestRequest request = new RestRequest("/api/img/{FileName}");
        request.AddParameter("FileName", "dummy.jpg", ParameterType.UrlSegment);
        _Client.ExecuteAsync<MemoryStream>(
        request,
        Response =>
        {
            if (Response != null)
            {
                var bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = Response.Data;
                String fn = String.Format(@"c:\temp\{0}.jpg", Guid.NewGuid().ToString());
                System.IO.File.WriteAllBytes(fn,Response.Data.ToArray());
                bitmapImage.EndInit();
                img.Source = bitmapImage;
            }
        });
    }

尽管调用this.dispatcher.Invoke,我仍然会收到错误:调用线程无法访问此对象,因为其他线程拥有它。

是否使用调试器检查异常?如果在后台任务上引发异常,则除非访问
task.Result
或使用
wait
运算符,否则不会在调用方代码上重新引发异常


我的猜测是,您无法访问您正在写入的
C:
的位置。不过,这段代码似乎没有必要,您应该能够直接将映像的源代码设置为您拥有的流,而无需将其写入磁盘。请尝试对编写过程进行注释,以将代码段挤出,并查看是否解决了问题。

由于
位图图像是在UI线程以外的另一个线程中创建的,因此您还必须调用以使其在UI线程中可访问

尽管此处并非严格必要,但最好始终处理所有
IDisposable
对象,包括
MemoryStream
。因此,您还必须将属性设置为

冻结的位图图像可在UI线程中访问:

Dispatcher.Invoke((Action)(() => img.Source = bitmapImage));

更新了答案。请注意,仍然需要设置
BitmapCacheOption.OnLoad
.Thx。.Freeze()是丢失的链接。
using (var memoryStream = new MemoryStream(imageBytes))
{
    bitmapImage.BeginInit();
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    bitmapImage.StreamSource = memoryStream;
    bitmapImage.EndInit();
    bitmapImage.Freeze();
}
Dispatcher.Invoke((Action)(() => img.Source = bitmapImage));