首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WPF中,如何将BitmapImage从后台线程传递到UI线程?

在WPF中,如何将BitmapImage从后台线程传递到UI线程?
EN

Stack Overflow用户
提问于 2010-06-14 12:00:49
回答 1查看 18.2K关注 0票数 25

我有一个后台线程,它生成一系列BitmapImage对象。每次后台线程完成生成一个位图时,我都想向用户显示这个位图。问题是弄清楚如何将BitmapImage从后台线程传递到UI线程。

这是一个MVVM项目,所以我的视图有一个Image元素:

<Image Source="{Binding GeneratedImage}" />

我的视图模型有一个属性GeneratedImage

private BitmapImage _generatedImage;

public BitmapImage GeneratedImage
{
    get { return _generatedImage; }
    set
    {
        if (value == _generatedImage) return;
        _generatedImage= value;
        RaisePropertyChanged("GeneratedImage");
    }
}

我的view-model也有创建后台线程的代码:

public void InitiateGenerateImages(List<Coordinate> coordinates)
{
    ThreadStart generatorThreadStarter = delegate { GenerateImages(coordinates); };
    var generatorThread = new Thread(generatorThreadStarter);
    generatorThread.ApartmentState = ApartmentState.STA;
    generatorThread.IsBackground = true;
    generatorThread.Start();
}

private void GenerateImages(List<Coordinate> coordinates)
{
    foreach (var coordinate in coordinates)
    {
        var backgroundThreadImage = GenerateImage(coordinate);
        // I'm stuck here...how do I pass this to the UI thread?
    }
}

我想以某种方式将backgroundThreadImage传递给UI线程,在那里它将变成uiThreadImage,然后设置GeneratedImage = uiThreadImage以便视图可以更新。我看过一些处理WPF Dispatcher的例子,但是我似乎想不出一个解决这个问题的例子。请给我建议。

EN

回答 1

Stack Overflow用户

发布于 2011-09-23 05:42:32

在后台,线程处理流。

例如,在后台线程中:

var artUri = new Uri("MyProject;component/../Images/artwork.placeholder.png", UriKind.Relative);

StreamResourceInfo albumArtPlaceholder = Application.GetResourceStream(artUri);

var _defaultArtPlaceholderStream = albumArtPlaceholder.Stream;

SendStreamToDispatcher(_defaultArtPlaceholderStream);

在UI线程中:

void SendStreamToDispatcher(Stream imgStream)
{
     dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
     {
        var imageToDisplay = new BitmapImage();
        imageToDisplay.SetSource(imgStream);

        //Use you bitmap image obtained from a background thread as you wish!
     })); 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3034902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档