C# 高级开发应用:如何防止界面卡死

在学习如何防止界面卡死之前我们先来学习几个基本概念。进程、线程、单线程、多线程、多进程。

进程:是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

线程:是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

单线程:程序只有一个执行流,就是只有一个线程,默认情况下,系统为应用程序分配一个主线程,该线程执行程序中以Main方法开始和结束的代码。

多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多进程:往往指计算机同时启动多个程序,或者一个程序启动了多个其他程序。

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

我们在C#开发Winform窗体程序时,很多时候需要界面在动态的展示数据,但要求界面能进行拖动,而不卡死。我们常常在线程中需要访问UI界面的时,会发生异常,原因是我在跨线程调用主线程的控件,因此windows GUI编程有一个规则,就是只能通过创建控件的线程来操作控件的数据,否则就可能产生不可预料的结果。 .Net涉及到的相关技术介绍如下。

Invoke beginInvoke介绍

Invoke 与begininvoke区别在于,invoke会阻塞当前线程,直到invoke调用结束,才会继续执行下去,而begininvoke 则可以异步进行调用,也就是该方法封送完毕后马上返回,不会等待委托方法的执行结束,调用者线程将不会被阻塞。但是调用者也可以使用EndInvoke方法或者其它类似WaitHandle机制等待异步操作的完成。

   Invoke和begininvoke的使用有两种情况:

  1. control中的invoke、begininvoke。  

  2. delegrate中的invoke、begininvoke。  

   control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。

 control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。 可以理解invoke表是同步、begininvoke表示异步。Invoke和begininvoke其实是相对于子线程而言的,其实对于控件的调用总是由主线程来执行的。

我们大部分时间是在执行操作的过程中要更新界面数据,我们可以通过2(通过代理)解决从不是创建控件的线程访问界面控件。

实例说明:

C# 高级开发应用:如何防止界面卡死_第1张图片

C# 高级开发应用:如何防止界面卡死_第2张图片

你可能感兴趣的:(多线程,c#,windows,.net)