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控件的操作
}));
});
使用异步/多线程的方式一般都会考虑到创建委托,然后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 单例注入的类中含非线程安全属性
- Spring-利用ThreadLocal解决线程安全问题(多线程并发登录)
- 多线程-同步代码块解决线程安全问题的解释以及同步的特点及好处和弊端
- VS2005 多线程问题--窗体中的线程安全调用
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
- 在多线程中使用静态方法是否有线程安全问题(转载)
- 12-多线程(卖票示例)1 2 14-多线程(线程安全问题产生的原因)
- 多线程_同步代码块解决线程安全问题的解释
- Java多线程模拟售票程序,及线程安全问题
- 用线程安全随机数解决Random在多线程中随机性重复的问题
- java进程、线程、多线程以及线程安全问题
- 23 API-多线程(多线程概述,多线程实现方案,线程控制常见方法,线程安全问题及解决)
- 多线程一共就俩问题:1.线程安全(访问共享数据) 2.线程通信(wait(),notify())
- 在多线程中使用静态方法是否有线程安全问题
- 关于java中多线程的问题的一点思考(什么情况下需要考虑到线程,以及线程安全的问题?)
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)
- 在多线程中使用静态方法是否有线程安全问题
- 在多线程中使用静态方法是否有线程安全问题
- 多线程原理、线程安全函数和多线程程序需要注意的问题
- 关于多线程在简单的懒汉模式下线程安全问题的解决