1. 程式人生 > >C#中執行緒間操作無效: 從不是建立控制元件 txtBOX 的執行緒訪問它。

C#中執行緒間操作無效: 從不是建立控制元件 txtBOX 的執行緒訪問它。

delegate void 委託名(方法名);

void 方法名()

if(txtBox.invokeRequered)

{

委託名 d=new 委託名();

txtBox.invoke(d);

}

else

{

具體的執行語句

}

原來是存在跨執行緒呼叫控制元件的問題

解決方法有兩種:第一是加一句話,第二是用委託。因為一句話成功了 我就沒有用委託了~  

1.解決方法就加了一句話

private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

        {

            ////////////////////執行緒開始的時候加這麼一句

            Control.CheckForIllegalCrossThreadCalls = false;

            string str = mycomm.ReadExisting().ToString();

            txtreceive.Text = txtreceive.Text + str;

        }

ok 程式就執行成功了~

第二:
用委託,在05裡,每個控制元件都有個InvokeRequired的屬性~
判斷一下是不是true,是的話進行Invoke操作的,完事了~



//建立個委託
        private delegate void ShowDelegate(string strshow);

        public void Show(string strshow)

        {

            if (this.txtreceive.InvokeRequired)

            {

             //   this.txtreceive.BeginInvoke(new ShowDelegate(Show), strshow);//這個也可以

                this.txtreceive.Invoke(new ShowDelegate(Show), strshow);

            }

            else

            {

                    this.txtreceive.Text += strshow;

            }

        }

第一種方法只是簡單的將錯誤提示禁用了,仍然存在跨執行緒呼叫控制元件的問題。為此可能造成兩個執行緒同時或者迴圈改變該控制元件的狀態導致執行緒死鎖。 

Invoke方法是同步的方法,所以執行過程是有先後順序的,所以就不會出現那個異常了 最好是用第二種方法