C# 关于多线程的一点事
2017-09-11 15:48
459 查看
C#作为一种高级语言,其安全性方面有了极大的提升,但同时,偶尔也会给我们的开发带来一些不便,或者说它在安全性方面的设置是我们需要了解并掌握的
而今天在这里要说的就是多线程。
C#程序有个主线程,我们也叫它UI线程,它负责程序主要的工作,但在开发过程中,我们经常需要用到多线程,如果我们像C++那样,简单的起个thread,然后运行线程去访问窗口组件是,VS编辑器会报错,这是因为C#做了一些安全限制,子线程是无法访问到UI线程创建的组件的,如果我们要访问,有两个方法:
1,通过Invoke,begininvoke函数,也就是C#的托管方式,这种方式基本可以满足我们大部分的要求了
2,同时设置 CheckForIllegalCrossThreadCalls = false;这是一个开关,设置以后,不同线程就可以访问到组件而不会被报错
然而,近期项目遇到一个坑:有个登录窗口,登录以后会自动登录进入到主界面窗口。这是两个不同的窗口。
自动登录的时候,会和后台做一些登录交互,从而导致登录窗口有白屏,这个现象我们很自然的想到是显示问题:窗口显示后立马做自动登录,导致卡屏。
然后我们自然想到用多线程,首先就是用上面第一种方式:invoke和begininvoke,可是无法解决卡屏问题,故而猜测,C#里面的托管,最终还是要到UI线程来执行
接着尝试第二种方式,前面说到C#是线程安全的,在子线程结束的时候,其创建的资源都会被回收,故而虽然可以解决卡屏问题,但是主界面窗口在子线程结束以后会消失,因为线程结束的同时窗口资源也已经被回收,即便我们尝试先创建窗口资源然后在子线程里面显示,还是会有这个问题。
看来,C#的多线程机制我们还需要多多研究。
最终解决方案很简单,加一个timer控件,延时做自动登录的操作,完美解决,其实这个方案一开始就想到了,只是不想增加控件所以先尝试多线程
而今天在这里要说的就是多线程。
C#程序有个主线程,我们也叫它UI线程,它负责程序主要的工作,但在开发过程中,我们经常需要用到多线程,如果我们像C++那样,简单的起个thread,然后运行线程去访问窗口组件是,VS编辑器会报错,这是因为C#做了一些安全限制,子线程是无法访问到UI线程创建的组件的,如果我们要访问,有两个方法:
1,通过Invoke,begininvoke函数,也就是C#的托管方式,这种方式基本可以满足我们大部分的要求了
2,同时设置 CheckForIllegalCrossThreadCalls = false;这是一个开关,设置以后,不同线程就可以访问到组件而不会被报错
然而,近期项目遇到一个坑:有个登录窗口,登录以后会自动登录进入到主界面窗口。这是两个不同的窗口。
自动登录的时候,会和后台做一些登录交互,从而导致登录窗口有白屏,这个现象我们很自然的想到是显示问题:窗口显示后立马做自动登录,导致卡屏。
然后我们自然想到用多线程,首先就是用上面第一种方式:invoke和begininvoke,可是无法解决卡屏问题,故而猜测,C#里面的托管,最终还是要到UI线程来执行
接着尝试第二种方式,前面说到C#是线程安全的,在子线程结束的时候,其创建的资源都会被回收,故而虽然可以解决卡屏问题,但是主界面窗口在子线程结束以后会消失,因为线程结束的同时窗口资源也已经被回收,即便我们尝试先创建窗口资源然后在子线程里面显示,还是会有这个问题。
看来,C#的多线程机制我们还需要多多研究。
最终解决方案很简单,加一个timer控件,延时做自动登录的操作,完美解决,其实这个方案一开始就想到了,只是不想增加控件所以先尝试多线程
相关文章推荐
- 关于C#多线程、网络编程与计时器Timer的一点使用心得
- 关于C#多线程的学习和一点疑惑
- c# 关于Task类处理多线程的学习
- 关于C#中Thread.Join()的一点理解
- 关于C#string.replace 一点感想(有点非技术)
- c# 关于Handler得一点说明。
- 【面向对象语言系列】关于 C# 多线程编程,你需要知道的事
- c#中关于compare比较的一点注意事项
- 对于C#基本知识的一点感悟(1)——关于C#语法的抽象
- [C#]关于DLL使用.exe.config 的问题,也许以下描述有一点帮助
- 关于多线程编程的一点思考
- 关于C#里面socket编程的一点理解
- 关于C#中switch语句的一点注意
- 关于《GIS 点、线缓冲区生成算法的C#实现(V0.95)》的一点备注
- C#中一道关于多线程的基础练习题——模拟仓库存销过程
- 多线程中关于synchronized的一点事
- 关于多核多CPU多线程和并行计算的一点补充
- 关于一道C#上机题的一点想法
- [C#]关于DLL使用.exe.config 的问题,也许以下描述有一点帮助
- [C#]关于DLL使用.exe.config 的问题,也许以下描述有一点帮助