歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C#多線程和線程安全問題

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

日期:2017/3/1 9:54:06   编辑:Linux編程

在很多情況下〔都會〕或者〔需要〕使用到多線程,這樣會給用戶帶來更好的體驗,不至於用戶正在操作一個功能時突然卡死啦。在.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控件的操作
}));
});

Copyright © Linux教程網 All Rights Reserved