Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复无法从另一个线程访问线程元素的问题_C#_Multithreading_Multitasking - Fatal编程技术网

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

C# 如何修复无法从另一个线程访问线程元素的问题,c#,multithreading,multitasking,C#,Multithreading,Multitasking,我正在做一个C#WinForms项目 我尝试在我的应用程序的一部分中使用多线程: 零件代码(方法): public void ShowData() { Thread t; t = new Thread(() => { using (GVentesEntities context = new GVentesEntities()) { dataGridView1.DataSource = (fro

我正在做一个
C#WinForms
项目

我尝试在我的应用程序的一部分中使用
多线程

零件代码(方法):

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:“跨线程操作无效:从创建控件的线程以外的线程访问控件“dataGridView1”。


请帮助我处理这个问题并执行我的线程方法?提前感谢。

您需要重新绑定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));

也许您应该使用System.Threading.Tasks.Task?这个答案没有帮助,请我需要一个实际和明确的解决方案,在您的允许后,先生,非常感谢您的时间这不是一个答案,这是一个评论。请你提供更多关于你想要达到的目标的信息好吗?您是否试图在后台执行操作,同时保持UI未冻结?编辑:Nevermind是双重的谢谢先生这是一个非常有用的答案,先生,请问您是否有关于
C#
中多线程文档的链接有很多教程和示例,快速谷歌会找到很多。如果你想真正深入了解,可以推荐这本书-