2

我正在尝试从网络服务器获取大量图像,因此不要让服务器每秒有数百个请求超载,我只让一些在 WebService 中处理的请求通过。以下代码位于保存图像的对象上,以及所有绑定的位置。

ThreadStart thread = delegate()
{
    BitmapImage image = WebService.LoadImage(data);

    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
    {
        this.Image = image;
    }));
};

new Thread(thread).Start();

图像加载得很好,UI 在图像加载时流畅地工作,但从this.Image = image未被调用。如果我使用Dispatcher.CurrentDispatcher.Invoke(..)该行被调用,但不适用于设置图像。为什么调度程序不调用我的操作?

4

2 回答 2

3

由于您BitmapImage是在工作线程上创建的,因此它不属于 WPF 线程。也许这段代码可以帮助您解决问题:

您发布的代码

ThreadStart thread = delegate()
{
    BitmapImage image = WebService.LoadImage(data, Dispatcher.CurrentDispatcher);

    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
    {
        this.Image = image;
    }));
};

new Thread(thread).Start();

你如何改变你WebService.LoadImage的“让它工作”

BitmapImage LoadImage(object data, Dispatcher dispatcher)
{
    // get the raw data from a webservice etc.
    byte[] imageData = GetFromWebserviceSomehow(data);

    BitmapImage image;

    // create the BitmapImage on the WPF thread (important!)
    dispatcher.Invoke(new Action(()=>
    {
        // this overload does not exist, I just want to show that
        // you have to create the BitmapImage on the corresponding thread
        image = new BitmapImage(imageData);
    }));

    return image;
}
于 2012-12-29T16:47:10.457 回答
1
System.Object
    |-> System.Windows.Threading.DispatcherObject
        |-> System.Windows.DependencyObject
            |-> System.Windows.Freezable
                |-> ... 
                    |-> System.Windows.Media.Imaging.BitmapImage

BitmapImage是线程关联的。所以this控件和BitmapImage对象应该在同一个线程中创建。您也可以尝试仅冻结图像,但似乎无济于事。

BeginInvoke不会显示错误,因为它是由 WPF 处理的。请参阅 MSDN 如何设置 WPF 跟踪。

WPF 是单线程的。阅读一些所有员工都描述过的关于 WPF 的书。

于 2012-12-29T16:18:40.700 回答