我遇到来自其他线程的事件的问题,我无法在第一个线程中调用我的函数。
这是代码:
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上。
答案 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) ;)
您需要验证项目的体系结构。尝试使用事件处理程序以避免此异常。
快乐编码