知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入
内容目录一、线程统一取消模型
线程取消在多线程开发中非常普遍,鉴于此微软在.NET4.0基础类库中引入线程统一取消模型对线程取消功能的支持。
1、取消令牌线程统一取消模型中两个重要的类型就是CancellationToken和CancellationTokenSource
每个CancellationTokenSource对象都包容着一个“取消令牌(CancellationToken)”,并通过它的Token属性向外界展露,用法也很简单通过调用CancellationTokenSource的Cancel()方法通知取消令牌。下面有个小栗子
下面介绍一个可以中断的线程模型流程
1、设计一个中断函数一个可以中断的线程函数模板看起来像下面这样
public class ThreadFuncObject{
//通过构造函数从外界传入取消令牌
private CancellationToken _token;
public ThreadFuncObject(CancellationToken token)
{
_token = token;
}
public void DoWork()
{
//各种功能代码...
if (_token.IsCancellationRequested)
{
//完成清理工作...
//简单的处理直接return即可
//return;
//建议抛出个取消异常
throw new OperationCanceledException(_token);
}
//各种功能代码...
}
}
2、创建CancellationTokenSource对象 CancellationTokenSource tokenSource = new CancellationTokenSource();
3、启动线程 ThreadFuncObject obj = new ThreadFuncObject(tokenSource.Token);
Thread th = new Thread(obj.DoWork);
th.Start();
4、取消线程执行 tokenSource.Cancel();
二、跨线程访问UI基本方法
刚开始桌面程序开发时,在做进度条等通知UI更新的功能时,经常会遇到跨线程访问UI的问题,抛的错就是控件不能从不是创建它的线程去更改。
在.NET Framework中,所有的可视化控件都从System.Windows.Forms.Control类派生而来,考虑到跨线程访问控件的需要,Control类提供了相应的方法完成跨线程更新界面。
1、Control.Invoke和BeginInvoke //// 摘要:
// 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
//
// 参数:
// method:
// 包含要在控件的线程上下文中调用的方法的委托。
//
// 返回结果:
// 正在被调用的委托的返回值,或者如果委托没有返回值,则为 null。
public object Invoke(Delegate method);
Invoke方法的参数是一个委托,代表在创建控件的线程中要执行的方法。实际场景中是要向UI传值的,可以使用下面的重载
//// 摘要:
// 在拥有控件的基础窗口句柄的线程上,用指定的自变量列表执行指定委托。
//
// 参数:
// method:
// 一个方法委托,它采用的参数的数量和类型与 args 参数中所包含的相同。
//
// args:
// 作为指定方法的参数传递的对象数组。 如果此方法没有参数,该参数可以是 null。
//
// 返回结果:
// System.Object,它包含正被调用的委托返回值;如果该委托没有返回值,则为 null。
public object Invoke(Delegate method, params object[] args);