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

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控件,延时做自动登录的操作,完美解决,其实这个方案一开始就想到了,只是不想增加控件所以先尝试多线程

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