得到一个我不能使用对象的错误,因为它在错误的线程上

时间:2016-10-02 17:47:02

标签: c# wpf multithreading wpf-controls dispatcher

我遇到来自其他线程的事件的问题,我无法在第一个线程中调用我的函数。

这是代码:

namespace Gestion_Photo_CM
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        GestionRecherche gRech = new GestionRecherche();
        Dispatcher disp = Dispatcher.CurrentDispatcher;

        public MainWindow()
        {
            InitializeComponent();
            gRech.evt_creer_objimage += afficherimage;
        }

        /// <summary>
        /// Affichage dynamique des images
        /// </summary>
        /// <param name="path"></param>
        public void afficherimage(Image obj)
        {
            if (disp.CheckAccess())
            {
                this.Dispatcher.Invoke(delegate () { afficherimage(obj); });
            }
            else
            {
                this.RootGrid.Children.Add(obj);
            }
        }

        /// <summary>
        /// Validation du chemin entré
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_valid_Click(object sender, RoutedEventArgs e)
        {
            string cheminDossier = tbfolderpath.Text;
            Thread thScanDossier = new Thread(delegate () { gRech.ScanDossiers(cheminDossier); });
            thScanDossier.SetApartmentState(ApartmentState.STA);
            thScanDossier.Start();
        }
    }
}

当程序进入这一行时:

this.RootGrid.Children.Add(obj);

Exception表示它无法使用该对象,因为它位于另一个Thread上。

2 个答案:

答案 0 :(得分:0)

你的病情已经恢复正常。对于Dispatcher.CheckAccess,每the documentation,它会返回:

  如果调用线程是与此Dispatcher关联的线程,则

true ;否则, false

如果它返回Invoke,则需要致电false

if (this.Dispatcher.CheckAccess())
{
    this.RootGrid.Children.Add(obj);
}
else
{
    this.Dispatcher.Invoke(delegate () { afficherimage(obj); });
}

我强烈建议您查看Task.Run,而不是直接使用Thread

答案 1 :(得分:-1)

  

调用线程无法访问此对象,因为它不同   线程拥有它

当人们开始使用WPF时,这是一个常见的问题,这种异常的主要原因是因为你试图从主线程以外的线程更新UI元素(在你的情况下&#34; RootGrid&#34) ;)

您需要验证项目的体系结构。尝试使用事件处理程序以避免此异常。

快乐编码