程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#多線程和線程安全問題

C#多線程和線程安全問題

編輯:C#入門知識

在很多情況下〔都會〕或者〔需要〕使用到多線程,這樣會給用戶帶來更好的體驗,不至於用戶正在操作一個功能時突然卡死啦。在.net 的winform情況下,一般在不涉及到控件操作,數據量又很大的情況下可以考慮使用〔異步/輔助線程〕。

使用異步/多線程的方式一般都會考慮到創建委托,然後BeginInvoke,或者直接另辟Thread操作,實際上異步和多線程是有細微區分的,更嚴格的異步好像和什麼硬盤的結構有關系,而多線程不是。呵呵不管那麼多深奧的東東,以下以委托和Thread為例幾種創建方式和輔助線程安全的問題。

異步

多見的是①創建委托。②創建委托實例或者稱為事件。③為事件綁定方法。④調用啦

        public delegate void ThreadHandler();
        public ThreadHandler ThreadEvent = null;
        public void ThreadInvoke()
        {
            //...
            return;
        }

然後在具體的事件裡調用,如下:

            ThreadEvent = new ThreadHandler(ThreadInvoke);
            ThreadEvent.BeginInvoke(result =>//回調函數,當ThreadInvoke執行完調用,然後結束異步。
                {
                    (result.AsyncState as ThreadHandler).EndInvoke(result);
                }, null);

多線程

借助於以上代碼,常見的如:

           Thread t = new Thread(ThreadInvoke);//普通方式
            t.IsBackground = true;
            t.Start();

或者使用在framework 2.0就出現的匿名方法:

            Thread t1 = new Thread(delegate()//匿名方法
                {
                    this.Invoke(new Action(delegate() //這裡的this就是主線程UI的form
                        {
                            //...調用主線程UI控件的操作
                        }));
                });
            t1.IsBackground = true;
            t1.Start();

或者更直接使用lambda表達式:

           Thread t2 = new Thread(() =>//lambda表達式
            {
                //輔助線程執行...可以查看threadId和ui線程是不同的
            });
            t2.IsBackground = true;
            t2.Start();

線程安全

一般多線程都會涉及到線程安全,線程安全一般都是在非主線程調用了控件,因此一般當在輔助線程調用控件(或賦值之類的)時再委托主線程的方法去引用控件。代碼一般可以在輔助線程如下寫:

           {
                    this.Invoke(new Action(delegate() //這裡的this就是主線程UI的form
                        {
                            //...調用主線程UI控件的操作
                        }));
                });

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved