2017-06-28 14 views
0

Ich benutze Devexpress GridControl. Und ich möchte den Zellwert gemäß tcp-Nachrichten ändern.C# System.Reflection.TargetInvocationException mit Multithread

private void Form1_Load(object sender, EventArgs e) 
{ 
     grid_mygrid.DataSource = Get_Devices_Info.Get_Device_From_DB().Tables[0]; 
     this.tcpListener = new TcpListener(IPAddress.Any, 2000); 
       this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
       this.listenThread.Priority = ThreadPriority.Highest; 
       this.listenThread.Start(); 
} 
private void ListenForClients() 
     { 
      this.tcpListener.Start(); 
      while (true) 
      { 
       TcpClient client = this.tcpListener.AcceptTcpClient(); 
       Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
       clientThread.Start(client); 
      } 
     } 

private void HandleClientComm(object client) 
     { 
     ... 
     try 
      { 
      gridView1.SetRowCellValue(row_index, "boot_progress", 50); 
      } 
     catch(Exception e) 
      { 
      if (e.InnerException != null) 
       {            
        Log2LogText(e.InnerException.Message); 
       } 
      }    
     ... 
    } 

wenn ich will diese unter dem Thread versuchen

gridView1.SetRowCellValue(row_index, "boot_progress", 50); 

wenn row_index = 0 -> Es ist OK
wenn row_index> 0 ->Eine nicht behandelte Ausnahme des Typs ‚System.Reflection .TargetInvocationException‘ist in mscorlib.dll aufgetreten

Über Gridcontrol , wenn ich versuchen, diese mit der Taste

klicken
gridView1.SetRowCellValue(1, "boot_progress", 50); -> It is OK 
gridView1.SetRowCellValue(2, "boot_progress", 50); -> It is OK 
gridView1.SetRowCellValue(4, "boot_progress", 50); -> There is no row with index 4. But there is no error. It is OK. 
gridView1.SetRowCellValue(5, "random_column", 50); -> There is no column with "random_column". But there is no error. It is OK. 

Ich benutze try-catch, aber dieser Code gibt immer noch einen Fehler und Programm zu stoppen. Wenn ich diese Zeile Kommentar

gridView1.SetRowCellValue(row_index, "boot_progress", 50); 

gibt es kein Problem

ich für Ihre Vorschläge warte.

+1

Lesen Sie die InnerException. – SLaks

+0

UI ist nicht Thread-sicher. Sie müssen den UI-Thread ausführen. – SLaks

+1

Sie sollten Ihren UI-Code von Ihrer TCP/Logik trennen. – SLaks

Antwort

Verwandte Themen