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

问题描述 投票:0回答:2

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

这是代码:

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上。

c# wpf multithreading wpf-controls dispatcher
2个回答
0
投票

你的病情已经恢复到了前面。根据the documentationDispatcher.CheckAccess,它返回:

如果调用线程是与此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
投票

调用线程无法访问此对象,因为另一个线程拥有它

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

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

快乐的编码

© www.soinside.com 2019 - 2024. All rights reserved.