首页 文章 精选 留言 我的

精选列表

搜索[c 17],共10000篇文章
优秀的个人博客,低调大师

C#线程安全使用(五)

CancellationToken的多种应用 这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。 1,ThreadPool直接启动线程,传递CancellationToken。 2,Task启动线程,传递CancellationToken。Task传递方式分为两种,一种通过Task的参数进行传递,另一种通过向线程内传递对象的方式传递CancellationToken。 3,CancellationToken的回调函数应用。 话不多说,请看代码。 class Program { static void Main(string[] args) { Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState); //使用线程池创建线程,然后取消线程 CancelWithThreadPoolMiniSnippet(); } static CancellationTokenSource cts = new CancellationTokenSource(); static CancellationToken token = cts.Token; static void CancelWithThreadPoolMiniSnippet() { Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState); #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},当前状态{1}", 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},当前状态{1}", t.GetHashCode(), 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的用法。 ---------------------------------------------------------------------------------------------------- 注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

优秀的个人博客,低调大师

C# 登录界面 密码修改

form1: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 简单登录界面 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { String name = this.textBox1.Text; // 获取里面的值 String password = this.textBox2.Text; if (name.Equals("admin") && password.Equals("admin")) // 判断账号密码是否等于admin { MessageBox.Show("登录成功"); } else { MessageBox.Show("登录失败!"); } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); } } } form2: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 简单登录界面 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string userName = textBox1.Text; string oldPassWord = textBox2.Text; string newPassWord = textBox3.Text; string checkPassWord = textBox4.Text; if (oldPassWord != "admin") { MessageBox.Show("原密码错误!", "提示"); return; } if (newPassWord != checkPassWord) { MessageBox.Show("两次输入的密码不一致!", "提示"); return; } if (newPassWord.Length < 7) { MessageBox.Show("密码长度必须大于6个字符"); return; } if (newPassWord == oldPassWord) { MessageBox.Show("新旧密码不能一样"); return; } else { MessageBox.Show("密码修改成功"); } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Close(); } } }

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册