日期:2014-05-17  浏览次数:20952 次

弱弱的问一下C#多线程操作界面 最新的问题~~
网上的最优解法
---多线程异步调用委托
先 Thread thread = new (..); thread.IsBackGround = true; Start()
方法的委托()
{while(true)

  { ThreadSleep(???);
  if (this.InvokeRequired)
  this.BeginInvoke(方法);
  else 方法()
   
  }
}
方法() { }
。。。
但是还是出错 至于Control。忽视跨线程的属性, 这个就不要动他了。。。
大家有什么好方法...................................................................

------解决方案--------------------
BeginInvoke早就试了 cross-thread异常
是因为你在另外一个 线程中操作 UI 控件了。
------解决方案--------------------
可以试试用 WindowsFormsSynchronizationContext 。

异步委托?最优? 算了吧,宁愿用 Contorl.Invoke 都不想用它,起码在绝大部分情况之下, Contorl.Invoke 都会回到 UI 线程上。
------解决方案--------------------
下面是比较简便的一种方法!
C# code

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int n = serialPort1.BytesToRead;
    if(n==0) return;
    byte[] buffer = new byte[n];    
    serialPort1.Read(buffer, 0, n);//读所有数据
    string s100 = ByteArrayToHexString(buffer);//字节数组转为十六进制字符串
    this.Invoke((EventHandler)delegate(object s, EventArgs e)
    {
        TextBox1.Text += s100 + "\r\n";
    });