异步编程总结
-
异步编程是建立在委托基础上的一种编程方法
-
异步调用的每个方法都是独立的线程执行。因此。本质上就是一种多线程程序,也可以说是一种简化版本的多线程技术
-
比较适合在后台运行较为耗时的简单任务,并且任务要求相互独立,任务中不应该有代码直接访问可视化控件
-
如果后台任务要求必须按照特定顺序执行,或者必须访问公共资源,则异步编程不适合,而直接使用多线程技术
多线程的异步
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int a = 0;
//多线程编程
//委托:ParameterizedThreadStart
Thread objThread1 = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
a += i;
//控件的属性:作用是用来判断当前控件所在的使用环境是创建这个控件的线程(false)还是其他线程(true)
if (label1.InvokeRequired)
{
//控件的Invoke方法:方法中的第一个参数返回值为void的委托,第二个参数是给委托对应方法传递的参数
label1.Invoke(new Action<string>(s =>
{
label1.Text = $"【{s}】";
}), a.ToString());
}
Thread.Sleep(500);
}
});
objThread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
int a = 0;
Thread objThread02 = new Thread(() =>
{
for (int i = 0; i < 100; i++)
{
a += i;
if (label2.InvokeRequired)
{
label2.Invoke(new Action<int>(s =>
{
label2.Text = $"【{s}】";
}), a);
System.Threading.Thread.Sleep(200);
}
}
});
objThread02.Start();
}
}
如果创建的子线程未执行完成,当主线程关闭时,这时候会抛异常

这个错误的原因是:当主线程关闭时主线程中的labal2对象也跟着被释放了,而子线程中还依然在使用label2对象,子线程使用时发现label2没了,因此抛了这样一个异常
如果按照程序设计来分析:主线程都关闭了,对应的其下的子线程都要跟着关闭。
新的问题:主线程关闭,子线程如果未完成则没有关闭
解决方法:将程序中的子线程设置为后台线程则只要前台线程都关闭了,则后台线程自动关闭
后台线程
指的是程序中的一些功能不需要和一般线程同时执行,或者这些功能对于UI界面中显示方面要求不高,可以设置为后台线程
例如:VS工具中的,编译检测功能就是后台线程,当VS启动起来,除过前台线程给我们展示编辑菜单等界面,同时后台运行了检测程序
多线程
概念
-
进程:每一个独立的程序都是进程。操作系统有《进程管理模块》,管理同时运行的多个程序
-
进程和线程:一个进程可以有若干个线程
[http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html]:
句柄(Handle)
句柄是一个标识符,用于代表操作系统中的各种资源,比如各种窗体、GDI绘图对象、进程和线程对象、文件等都用句柄
句柄使用
-
即使进程退出,很多时候操作系统仍然保持进程句柄,操作系统句柄有限,使用用需要节省,比如打开文件后,使用完毕要及时关闭
-
句柄可以通过Process对象的Handle属性访问,比如进程退出的代码,时间等
总结:拥有图形界面的程序都有一个主窗体,这个窗体也对应有一个句柄。当窗体关闭时进程也关闭。主窗体一般由主线程负责创建
1010



被折叠的 条评论
为什么被折叠?



