总结网络上的解决方案:新线程=> 委托=> 主界面的异步更新方法(IAsyncResult BeginInvoke(Delegate method)),一句话就是通过委托调用另一个线程的异步方法.

验证方法:当线程执行时,拖拽主窗体,没有卡死迹象.

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading;
 9 using System.Threading.Tasks;
10 using System.Windows.Forms;
11 
12 namespace WinFormInvoke
13 {
14     public partial class frMain : Form
15     {
16         Invoker Invoker;
17 
18         public frMain()
19         {
20             InitializeComponent();
21         } 
22 
23         private void frMain_Load(object sender, EventArgs e)
24         {
25             Invoker = new Invoker(AsynUpdateTxtMethod);
26         }
27 
28         public void UpdateTxtMethod(string msg)
29         {
30             tbResult.AppendText(msg + "\r\n");
31             tbResult.ScrollToCaret();
32         }
33 
34         public void AsynUpdateTxtMethod(string msg)
35         {
36             if (tbResult.InvokeRequired)
37             {
38                 this.BeginInvoke(new Invoker.CallbackFunc(UpdateTxtMethod), msg);
39             }
40             else
41             {
42                 UpdateTxtMethod(msg);
43             }
44         } 
45 
46         private void btnStart_Click(object sender, EventArgs e)
47         {
48             Invoker.DoThread(int.Parse(tbAmount.Text.Trim()));
49         } 
50     }
51 }

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7 
 8 namespace WinFormInvoke
 9 {
10    public class Invoker
11    {
12         public delegate void CallbackFunc(string msg);
13         public CallbackFunc AsynCallback;
14                  
15         public Invoker(CallbackFunc callback)
16         {
17             AsynCallback = callback;
18         }
19 
20         public virtual void TheadMethod(int amount)
21         {
22             this.AsynCallback("线程开始");
23             for (int i = 0; i < amount; i++)
24             {
25                 this.AsynCallback(i.ToString());               
26                 Thread.Sleep(1000);
27             }
28 
29             this.AsynCallback("线程结束");
30         }
31 
32         public virtual void DoThread(int amount)
33         {
34             Thread t = new Thread(new ThreadStart(delegate
35             {
36                 TheadMethod(amount);
37             }));
38 
39             t.Start();
40         }
41     }
42 }
Invoker

 

 

Code:  WinFormInvoke.zip

 

posted on 2016-07-21 22:39  极简  阅读(4537)  评论(0编辑  收藏  举报