如何修复无法从另一个线程问题访问线程元素

问题描述

我正在从事一个C# WinForms项目。

我尝试在我的应用程序的一部分中使用multi threading

零件代码方法):

public void ShowData()
{
    Thread t;
    t = new Thread(() =>
      {

          using (GVentesEntities context = new GVentesEntities())
          {
              dataGridView1.DataSource = (from F in context.Facture.AsEnumerable() join C in context.Client.AsEnumerable() on F.CLT equals C.ID select new { ID = F.ID,F.Date,Client = $"{C.Nom} {C.Prenom}",Total = $"{(from df in context.Det_Fact.AsEnumerable() join cmd in context.Commande.AsEnumerable() on df.CMD equals cmd.ID where df.FACT == F.ID select cmd.QTE * cmd.PRU).Sum():00} MAD" }).OrderBy(x => int.Parse($"{x.ID.Substring(x.ID.IndexOf("-") + 1)}")).ToList();
          }

      });

    Thread.Sleep(1000);
    t.Start();
}

问题是,当我在应用程序运行时尝试访问此方法时,出现错误

错误

system.invalidOperationException: 'Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on.'

请提供任何帮助以解决此问题并使用线程执行我的方法?预先感谢。

解决方法

您需要在UI线程上重新绑定-例如

var values = (from F in context.Facture.AsEnumerable() join C in context.Client.AsEnumerable() on F.CLT equals C.ID select new { ID = F.ID,F.Date,Client = $"{C.Nom} {C.Prenom}",Total = $"{(from df in context.Det_Fact.AsEnumerable() join cmd in context.Commande.AsEnumerable() on df.CMD equals cmd.ID where df.FACT == F.ID select cmd.QTE * cmd.PRU).Sum():00} MAD" }).OrderBy(x => int.Parse($"{x.ID.Substring(x.ID.IndexOf("-") + 1)}")).ToList();

this.Invoke(new Action(() => this.dataGridView1.DataSource = values));