得到一个错误,我不能使用一个对象,因为它是在错误的线程
本文关键字:错误 一个对象 因为 线程 一个 不能 | 更新日期: 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
。