您的位置:首页 > 编程语言 > C#

C#多线程和线程安全问题

2013-08-13 16:12 92 查看
在很多情况下〔都会〕或者〔需要〕使用到多线程,这样会给用户带来更好的体验,不至于用户正在操作一个功能时突然卡死啦。在.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控件的操作

}));

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐