我有一个来自其他线程的事件的问题,我无法在第一个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上。
你的病情已经恢复到了前面。根据the documentation的Dispatcher.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
合作。
调用线程无法访问此对象,因为另一个线程拥有它
当人们开始使用WPF时,这是一个常见的问题,这个例外的主要原因是因为你试图从主线程以外的线程更新UI元素(在你的情况下是“RootGrid”)
您需要验证项目的体系结构。尝试使用事件处理程序以避免此异常。
快乐的编码