C#跨線程訪問控件


線程實現兩個lable標簽顯示:

 public partial class FrmThreadControl : Form
    {
        public FrmThreadControl()
        {
            InitializeComponent();
        }

        private void btnExecute1_Click(object sender, EventArgs e)
        {
            int a = 0;
            Thread objThread1 = new Thread(delegate()
            {
                for (int i = 1; i <= 20; i++)
                {
                    a += i;
                    if (this.lblResult1.InvokeRequired)//判斷是否調用Invoke方法
                    {
                        this.lblResult1.Invoke(new Action<string>(s => { this.lblResult1.Text = s; }), a.ToString());
                    }
                    Thread.Sleep(200);
                }
            });
            objThread1.IsBackground = true;//設置為后台線程(通常都要這樣設置)
            objThread1.Start();
        }

        private void btnExecute2_Click(object sender, EventArgs e)
        {
            int a = 0;
            Thread objThread2 = new Thread(() =>
            {
                for (int i = 1; i <= 50; i++)
                {
                    a += i;
                    if (this.lblResult2.InvokeRequired)//判斷是否調用Invoke方法
                    {
                        this.lblResult2.Invoke(new Action<string>(s => { this.lblResult2.Text = s; }), a.ToString());
                    }
                    Thread.Sleep(100);
                }
            });
            objThread2.IsBackground = true;
            objThread2.Start();
        }
    }

  異步實現計算方法:

 public partial class FrmCalllBack : Form
    {
        public FrmCalllBack()
        {
            InitializeComponent();

            //【3】初始化委托變量
            //   this.objMyCal = new MyCalculator(ExecuteTask);

            //也可以直接使用Lambda表達式
            this.objMyCal = (num, ms) =>
            {
                System.Threading.Thread.Sleep(ms);
                return num * num;
            };
        }

        //【3】創建委托變量(因為異步函數和回調函數都要用,所以定義成成員變量)
        private MyCalculator objMyCal = null;

        //【4】同時執行多個任務
        private void btnExec_Click(object sender, EventArgs e)
        {
            //發布任務
            for (int i = 1; i < 11; i++)
            {
                //開始異步執行
                objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                //最后一個參數i給回調函數的字段AsyncState賦值,如果數據很多可以定義成類或結構
            }
        }

        //【5】回調函數
        private void MyCallBack(IAsyncResult result)
        {
            int res = objMyCal.EndInvoke(result);
            //顯示異步調用結果:result.AsyncState字段用來封裝回調函數自定義參數,object類型
            Console.WriteLine("第{0}個計算結果為:{1}", result.AsyncState.ToString(), res);
        }

        //【2】根據委托定義一個方法:返回一個數的平方
        private int ExecuteTask(int num, int ms)
        {
            System.Threading.Thread.Sleep(ms);
            return num * num;
        }

        //【1】聲明委托
        private delegate int MyCalculator(int num, int ms);
    }
    //異步編程的總結:
    //1. 異步編程是建立在委托的基礎上一種編程的方法。
    //2. 異步調用的每個方法都是在獨立的線程中執行的。因此,本質上就是一種多線程程序,是簡化的多線程。
    //3. 比較適合在后台運行較為耗時的《簡單任務》,並且任務之間要求相互獨立,任務中不應該有直接訪問可視化控件大代碼。
    //4. 如果后台任務要求必須按照特定順序執行,或者訪問共享資源,則異步編程不太適合,應選擇多線程開發技術。

}

  多線程Thread的基礎使用:

public partial class FrmThead : Form
    {
        public FrmThead()
        {
            InitializeComponent();
        }
        //執行任務1
        private void btnExecute1_Click(object sender, EventArgs e)
        {
            int a = 0;
            //ThreadStart 委托定義:public delegate void ThreadStart()
            Thread objThread1 = new Thread(delegate()
                {
                    for (int i = 1; i <= 20; i++)
                    {
                        a += i;
                        Console.WriteLine(a + "     ");
                        Thread.Sleep(500);
                    }
                });
            objThread1.IsBackground = true;//設置為后台線程(通常都要這樣設置)
            objThread1.Start();
        }
        //執行任務2
        private void btnExecute2_Click(object sender, EventArgs e)
        {
            Thread objThread2 = new Thread(() =>
            {
                for (int i = 1; i <= 50; i++)
                {
                    Console.WriteLine("---------------a" + i + "----------------");
                    Thread.Sleep(100);
                }
            });
            objThread2.IsBackground = true;//設置為后台線程(通常都要這樣設置)
            objThread2.Start();
        }
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM