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

本文关键字:错误 一个对象 因为 线程 一个 不能 | 更新日期: 2023-09-27 18:09:50

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

这是代码:

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);

一个异常表示它不能使用该对象,因为它在另一个线程上。

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

你的病情已经恢复了。根据Dispatcher.CheckAccess的文档,它返回:

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

如果返回false,则需要调用Invoke:

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

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

相关文章: