C#线程安全使用(五)
<div style="width=100%; background: #4169E1; color: #ffffff; height:50px;font-size: 30px;">?CancellationToken的多种应用 这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。 1,ThreadPool直接启动线程,传递CancellationToken。 2,Task启动线程,传递CancellationToken。Task传递方式分为两种,一种通过Task的参数进行传递,另一种通过向线程内传递对象的方式传递CancellationToken。 3,CancellationToken的回调函数应用。 话不多说,请看代码。 #region 使用QueueUserWorkItem的构造函数,传递cts.Token,但我不喜欢这个模式 跟踪不了状态
//ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork),ctn);
#endregion
#region 使用传递参数的模式 传递CancellationToken,这里的cts.Token是作为Action的参数传递的
//var action = new Action<object>(DoSomeWork);
//Task t = new Task(action,ctn);
//t.Start();
//Console.WriteLine("开始,当前线程{0},t.GetHashCode(),t.Status);
#endregion
#region 使用Task的构造函数,传递cts.Token,但CancellationTokenSource要弄成全局变量,否则方法找不到,就取消不了。
//Task t = new Task(Work,cts.Token);
//t.Start();
#endregion
#region 注册回调函数,当CancellationTokenSource.Cancel()执行后,调用回调函数
token.Register(CallBack,true); //注册回调函数
Task t = new Task(Work);
t.Start();
#endregion
Thread.SpinWait(5000000);
cts.Cancel();
Console.WriteLine("结束,当前线程{0},t.Status);
Console.Read();
}
static void DoSomeWork(object obj)
{
CancellationToken token = (CancellationToken)obj;
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
// Simulating work.
//Thread.SpinWait(5000000);
if (token.IsCancellationRequested)
{
break;
}
}
}
static void Work()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i);
if (token.IsCancellationRequested)
{
break;
}
}
}
static void CallBack()
{
Console.WriteLine("I'm call back!" );
}
}
代码内执行结果如下,该结果为CancellationToken的回调函数应用: 到此NET Framework4.0里的线程安全就都讲完了。。。。。。。 虽然第一篇文章是2013年,虽然历时近五年,但请相信我,代码早在五年前就已经写完啦。只是我一直一直一直没配文字发出来。。。。。。 不过,也可能是最近写文字的能力有所提升,所以就完成了四和五。 不然这线程安全的文章可能还要拖。。。。。。。。哈哈 在NET Framework4.6里,微软提供了async和await语法,也是有关线程安全,我将会在新的语法相关文章里讲解async和await的用法。 ---------------------------------------------------------------------------------------------------- 注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |