C# 如何在后台同步下载图像?

C# 如何在后台同步下载图像?,c#,silverlight,windows-phone-7,silverlight-4.0,C#,Silverlight,Windows Phone 7,Silverlight 4.0,我有一个后台工作人员,我用它从web服务器获取一些数据。 还需要下载一些图像(png或jpg)。 但每次尝试在后台工作线程中创建BitmapImage或WriteableBitmap时,我都会获得无效的跨线程访问 是否有可能在后台而不是UI线程中加载图像?使用此选项,它将为您工作 Deployment.Current.Dispatcher.BeginInvoke(() => { //write here whateve

我有一个后台工作人员,我用它从web服务器获取一些数据。 还需要下载一些图像(png或jpg)。 但每次尝试在后台工作线程中创建BitmapImage或WriteableBitmap时,我都会获得无效的跨线程访问
是否有可能在后台而不是UI线程中加载图像?

使用此选项,它将为您工作

Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    //write here whatever you want to update on screen.
                    textblock.Text = "text changed";
                    // just like this line changed the text of a textblock
                });

在BackgroundWorker的
DoWork
方法中,您无法访问在主线程中创建的控件,但在该方法中,您可以将下载的图像传递给
RunWorkerCompleted
事件方法,因为此事件在创建BackgroundWorker的线程上运行(大多数情况下,它是主线程)


抱歉,我以为这是关于android的,请忽略此评论。我该如何删除评论呢?也许你可以解释一下为什么你认为你需要一个背景工作者来完成这项工作。创建
位图图像并为其指定URL不会在图像下载时阻止线程。框架已经将其作为异步操作实现。所以我不清楚为什么你需要“在后台同步”做这些事情?我正在写一个从web服务器检索信息的库。我希望它能够将所有数据保存到sterling数据库,以便在没有internet连接的情况下恢复和上次检索的数据。因此,我只是运行库来收集所有信息并将其存储到后台工作程序中的Sterling。也可以在计划任务中使用此库。您尝试使用的类设计为仅从UI(Dispatcher)线程使用,因此,您必须返回到UI线程,或者以原始格式存储图像数据,并且仅在需要时从UI线程创建此控件。@user924780不,这不是一个解决方法。问题是您无法访问位于其他线程中的对象,这将导致异常。有几种方法可以进行跨线程调用,这一种很好。@oleksii很奇怪,为什么我在后台创建对象时它位于UI线程中?行
var image=newwriteablebitmap(100100)
抛出exception@Sheldon:在Silverlight中,所有面向UI的类都特别限于主UI线程。甚至在后台线程上构造这样一个类的尝试都会导致异常。顺便说一句,即使您可以执行构造函数,但生成的对象对您来说毫无用处,您也永远无法将其包含在Silverlight VisualTree中。@AnthonyWJones谢谢,现在已经清楚了。我现在唯一的选择是下载图像并将其保留为字节数组(@Shedon:这实际上是有道理的。我不认为我会保留UI类的实例(这意味着所有额外的开销)即使我可以。我会在后台保留它最简单的表示形式/cache/DB,只在即将使用它时将其水合为UI元素。请记住,下载的图像流将采用压缩格式,使用imagetools,您甚至可以将可写位图中的像素阵列转换为PNG以用于存储。
BackgroundWorker backgroundworker = new BackgroundWorker();
backgroundworker.DoWork += new DoWorkEventHandler(backgroundworker_DoWork);
backgroundworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundworker_RunWorkerCompleted);


static void backgroundworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //download image and make Image class instance
    e.Result = //assign your image here
}

static void backgroundworker_DoWork(object sender, DoWorkEventArgs e)
{
    Image i = (e.Result as Image);
    //assign image to your control
}