C# 多线程 委托解决方案/winForm界面卡死
C# 2018-09-11 20:49:49

场景:在别的类中,调用主窗体的UI控件,报错信息:

线程间操作无效: 从不是创建控件“xxx”的线程访问它

 

主窗体:

C/C++ Code复制内容到剪贴板
  1.     public partial class Form1 : Form  
  2.     {  
  3.   
  4.         // 定义委托类型  
  5.         delegate void SetTextCallback(String str);  
  6.   
  7.         private void EmployeeButton_Click(object sender, EventArgs e)  
  8.         {  
  9.             // 开启线程   
  10.             Thread th = new Thread(ThreadProcSafe);  
  11.             th.Start();  
  12.         }  
  13.   
  14.         // 线程主体方法  
  15.         private void ThreadProcSafe()  
  16.         {  
  17.             // 创建对象  
  18.             SynchronizeDoor obj = new SynchronizeDoor  
  19.             {  
  20.                 _form1 = this  
  21.             };  
  22.             obj.DoorEmployee(); // 同步人员数据  
  23.         }  
  24.   
  25.         // 进入线程中插入日志说明   
  26.         public void InsertRichText(String str)  
  27.         {  
  28.             if (RichTextBox.InvokeRequired)  
  29.             {  
  30.                 // 解决窗体关闭时出现“访问已释放句柄”异常  
  31.                 while (RichTextBox.IsHandleCreated == false)  
  32.                 {  
  33.                     if (RichTextBox.Disposing || RichTextBox.IsDisposed) return;  
  34.                 }  
  35.   
  36.                 SetTextCallback d = new SetTextCallback(InsertRichText); // 返回委托的类型  
  37.                 RichTextBox.Invoke(d, new object[] { str });  
  38.   
  39.             }  
  40.             else  
  41.             {  
  42.                 RichTextBox.Text = RichTextBox.Text.Insert(0, DateTime.Now.ToString() + " - " + str + Environment.NewLine);  
  43.             }  
  44.   
  45.         }  
  46.   
  47.   
  48.   
  49.         private void Form1_FormClosed(object sender, FormClosedEventArgs e)  
  50.         {  
  51.             // 彻底的退出  
  52.             System.Environment.Exit(0);  
  53.         }  
  54.   
  55.           
  56.     }  
  57. }  

 

C/C++ Code复制内容到剪贴板
  1. class SynchronizeDoor  
  2. {  
  3.     public Form1 _form1;    // 将主窗口的form传递进来,可以调用其组件  
  4.   
  5.     // 同步人员数据  
  6.     public void DoorEmployee()  
  7.     {  
  8.         for (int i = 0; i < 1000; i++)  
  9.         {  
  10.             if (i % 2 == 0)  
  11.             {  
  12.                 _form1.InsertRichText("123456789");  
  13.             }  
  14.             else  
  15.             {  
  16.                 _form1.InsertRichText("一二三四五六七八九");  
  17.             }  
  18.             Thread.Sleep(1000);  
  19.         }  

 

 

 


 

新建一个richTextBox,多行文本框 ,命名:RecvRichTextBox

C# Code复制内容到剪贴板
  1. //线程内向文本框txtRecvMssg中添加字符串及委托    
  2. private delegate void PrintRecvMssgDelegate(string s);  
  3. private void PrintRecvMssg(string info)  
  4. {  
  5.     RecvRichTextBox.Text += string.Format("[{0}]:{1}\r\n",  
  6.         DateTime.Now.ToLongTimeString(), info);  
  7. }  

 

使用时:

C# Code复制内容到剪贴板
  1. string data = "123444";  
  2. Invoke(new PrintRecvMssgDelegate(PrintRecvMssg),  
  3.                         new object[] { data });  

 

 

 

 

本文来自于:http://www.yoyo88.cn/study/net/366.html

Powered by yoyo苏ICP备15045725号