Dispatcher.CheckAccess()失败

时间:2012-07-01 12:01:45

标签: c# wpf thread-safety

我有一个名为GUI.xaml的WPF UI,我需要更改其他类的标签和图像。更多我需要执行一项长任务,所以我正在使用后台工作人员。所以我在这个网站上看到了一个解决方案:

在GUI.xaml.cs中:

public static ChangeGUI someClass;    
private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        someClass = new ChangeGUI(this); //          
        TaskClass.ConnectionThread(SuperHero.getUserID());
    }
在ChangeGUI.cs中

public class ChangeGUI
{
    GUI _GUIRef;

    public ChangeGUI(GUI gui)
    {
        _GUIRef = gui;
    }

    public void ChangeLabel()
    {
        //here we can play with labels
    }
    public void ChangeMap(ImageSource tmp)
    {
        if (_GUIRef.image1.Dispatcher.CheckAccess())
            _GUIRef.image1.Source = tmp;//ERROR!!!!!!!!!!!!!! 
        else
            _GUIRef.image1.Dispatcher.Invoke(new Changer(ChangeMap), tmp);
    }
}

这里我收到一个错误:调用线程无法访问此对象,因为另一个线程拥有它。 欢迎帮助, 谢谢!

1 个答案:

答案 0 :(得分:2)

如果您在后台线程中创建了ImageSource,请确保将其冻结,以便可以从任何线程访问:

var imageSource = ...;
imageSource.Freeze();