C# winform编程中多线程操作控件方法

 1 private void Form1_Load(object sender, EventArgs e)

 2         {

 3             Thread newthread = new Thread(new ThreadStart(BackgroundProcess));

 4             newthread.Start();

 5  

 6         }

 7  

 8         /// <summary>    

 9         /// 定义一个代理    

10         /// </summary>    

11         private delegate void CrossThreadOperationControl();

12  

13         private void BackgroundProcess()

14         {

15             // 将代理实例化为一个匿名代理    

16             CrossThreadOperationControl CrossDelete = delegate()

17             {

18                 int i = 1;

19                 while (i < 5)

20                 {

21                     // 向列表框增加一个项目    

22                     listBox1.Items.Add("Item " + i.ToString());

23                     i++;

24                 }

25                 label1.Text = "我在新线程里访问这个lable!";

26                 listBox1.Items.Add(label1.Text);

27             };

28             listBox1.Invoke(CrossDelete);

29         }

 

收集一下,在C# winform编程中多线程操作控件时,可以有下面种方法:

1. 又看到一种方法(2014.1.6):

 

1. 刚看到一种方法(2014.1.5):

 1 private void btnTest_Click(object sender, EventArgs e)

 2         {

 3             if (this.txtIP.Text.Trim() != "" && this.txtPort.Text.Trim() != "")

 4             {

 5                 string proxy = this.txtIP.Text.Trim() + ":" + this.txtPort.Text.Trim();

 6                 string result = string.Empty;

 7                 this.btnTest.Enabled = false;

 8                 new Thread(delegate

 9                 {

10                     Stopwatch stopwatch = new Stopwatch();

11                     stopwatch.Start();

12                     HttpClient httpClient = new HttpClient();

13                     httpClient.Proxy = new WebProxy(proxy);

14                     httpClient.TimeOut = 2000;

15                     object result;

16                     try

17                     {

18                         string a = httpClient.Get("http://www.baidu.com", "", "", "", "", "get");

19                         if (a != "")

20                         {

21                             result = "响应成功!";

22                         }

23                         else

24                         {

25                             result = "响应失败!";

26                         }

27                     }

28                     catch

29                     {

30                     }

31                     stopwatch.Stop();

32                     result = result;

33                     result = string.Concat(new object[]

34                     {

35                         result,

36                         ",响应花费:",

37                         stopwatch.ElapsedMilliseconds,

38                         "ms"

39                     });

40                     this.BeginInvoke(delegate

41                     {

42                         this.lbResult.Text = result;

43                         this.btnTest.Enabled = true;

44                     });

45                 })

46                 {

47                     IsBackground = true

48                 }.Start();

49             }

50             else

51             {

52                 this.lbResult.Text = "请输入完整再提交!";

53             }

54         }

 

1. 直接使用表达式和Action()

 1 private void btnInitEnv_Click(object sender, EventArgs e)

 2         {

 3             //初始化环境时回显出来的文字不让看

 4             try

 5             {

 6                 this.textBoxOutPut.Clear();

 7                 this.btnInitEnv.Enabled = false;

 8                 this.labelStateInfo.Text = "";

 9                 this.labelStateInfo.ForeColor = Color.Red;

10 

11                 if (!WriteToSerialPort("diags"))

12                 {

13                     this.btnInitEnv.Enabled = true;

14                     return;

15                 }

16 

17                 Thread thread = new Thread(new ThreadStart(() =>

18                 {

19                     int i = 0;

20                     bool flagFind = false;

21                     StringBuilder sb = new StringBuilder();

22 

23                     while (true)

24                     {

25                         Thread.Sleep(300);

26                         this.Invoke(new Action(() =>

27                         {

28                             sb.Append(this.textBoxOutPut.Text);

29                             this.textBoxOutPut.Clear();

30                             if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))

31                             {

32                                 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,

33                                     DateTime.Now.ToString(PubilcConstVar.TimeFormat),

34                                     "Entering recovery mode, starting command prompt, Stop.\r\n"));

35                                 this.labelStateInfo.ForeColor = Color.Red;

36                                 this.labelStateInfo.Text = "初始化失败,请手动输入命令初始化";

37                                 flagFind = true;

38                                 this.btnInitEnv.Enabled = true;

39                             }

40                             else if (sb.ToString().Contains(":-)"))

41                             {

42                                 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,

43                                     DateTime.Now.ToString(PubilcConstVar.TimeFormat),

44                                     "进入操作模式成功\r\n"));

45                                 this.labelStateInfo.ForeColor = Color.Blue;

46                                 this.labelStateInfo.Text = "初始化成功";

47                                 flagFind = true;

48 

49                                 //将业务按钮使能

50                                 EnableBussinessButtons();

51                             }

52                         }));

53 

54                         if (flagFind || ++i > 20) //找开标志或10秒超时中断

55                         {

56                             break;

57                         }

58                     }

59 

60                     if (!flagFind)

61                     {

62                         this.Invoke(new Action(() =>

63                         {

64                             this.textBoxOutPut.Clear();

65                             this.labelStateInfo.ForeColor = Color.Red;

66                             this.labelStateInfo.Text = "初始化失败,超时";

67                             this.btnInitEnv.Enabled = true;

68 

69                             DisableBussinessButtons();

70                         }));

71                     }

72                 }));

73 

74                 thread.IsBackground = true;

75                 thread.Start();

76             }

77             catch (Exception ex)

78             {

79                 this.log.Write(ex.ToString());

80             }

81         }

 

2. 使用线程函数加action()

 1 private void btnInitEnv_Click(object sender, EventArgs e)

 2         {

 3             //初始化环境时回显出来的文字不让看

 4             try

 5             {

 6                 this.textBoxOutPut.Clear();

 7                 this.btnInitEnv.Enabled = false;

 8                 this.labelStateInfo.Text = "";

 9                 this.labelStateInfo.ForeColor = Color.Red;

10 

11                 if (!WriteToSerialPort("diags"))

12                 {

13                     this.btnInitEnv.Enabled = true;

14                     return;

15                 }

16 

17                 Thread thread = new Thread(new ThreadStart(MonitorOutPutThread));

18 

19                 thread.IsBackground = true;

20                 thread.Start();

21             }

22             catch (Exception ex)

23             {

24                 this.log.Write(ex.ToString());

25             }

26         }

   线程函数:

 1 private void MonitorOutPutThread()

 2         {

 3             int i = 0;

 4             bool flagFind = false;

 5             StringBuilder sb = new StringBuilder();

 6 

 7             while (true)

 8             {

 9                 Thread.Sleep(300);

10                 this.Invoke(new Action(() =>

11                 {

12                     sb.Append(this.textBoxOutPut.Text);

13                     this.textBoxOutPut.Clear();

14                     if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))

15                     {

16                         this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,

17                             DateTime.Now.ToString(PubilcConstVar.TimeFormat),

18                             "Entering recovery mode, starting command prompt, Stop.\r\n"));

19                         this.labelStateInfo.ForeColor = Color.Red;

20                         this.labelStateInfo.Text = "初始化失败,请手动输入命令初始化";

21                         flagFind = true;

22                         this.btnInitEnv.Enabled = true;

23                     }

24                     else if (sb.ToString().Contains(":-)"))

25                     {

26                         this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,

27                             DateTime.Now.ToString(PubilcConstVar.TimeFormat),

28                             "进入操作模式成功\r\n"));

29                         this.labelStateInfo.ForeColor = Color.Blue;

30                         this.labelStateInfo.Text = "初始化成功";

31                         flagFind = true;

32 

33                         //将业务按钮使能

34                         EnableBussinessButtons();

35                     }

36                 }));

37 

38                 if (flagFind || ++i > 20) //找开标志或10秒超时中断

39                 {

40                     break;

41                 }

42             }

43 

44             if (!flagFind)

45             {

46                 this.Invoke(new Action(() =>

47                 {

48                     this.textBoxOutPut.Clear();

49                     this.labelStateInfo.ForeColor = Color.Red;

50                     this.labelStateInfo.Text = "初始化失败,超时";

51                     this.btnInitEnv.Enabled = true;

52 

53                     DisableBussinessButtons();

54                 }));

55             }

56         }

 

3. 就是使用委托,这个网上例子很多,不再实现

你可能感兴趣的:(WinForm)