• 多线程System.Threading和InvokeRequired、Invoke


    今天看到别人写的程序里有InvokeRequired、Invoke这两个属性最后上网查阅了下原来这两个属性用来判断控件线程是否被占用,以及占用后的处理而谈到线程占用的话就牵扯到了多线程的问题本来我想写一个多线程的例子来测试InvokeRequired、Invoke 起初设想的是用一个timer控件在一定时间内往listbox里添加内容在这期间我用再用一个控件来触发另一个往listbox添加内容的方法结果我失败了执行的时候还是按照单线程的顺序来执行。因此我上网查阅C#是如何使用多线程的所以我找到了一个例子是写如何简单实现一个多线程

    引入命名空间:System.Threading

    namespace ThreadExample 

        public partial class Form1 : Form 
        { 
            Thread thread1, thread2; 
            Class1 class1; 
            public Form1() 
            { 
                InitializeComponent(); 
                class1 = new Class1(this); 
            } 
     
            private void btn_Start_Click(object sender, EventArgs e) 
            { 
                txt_Text.Text = ""; 
                class1.shouldStop = false; 
                thread1 = new Thread(class1.Method1); 
                thread1.IsBackground = true;    //设置为后台线程,既前台线程全部结束后, 后台也跟着结束。 
                thread2 = new Thread(class1.Method2); 
                thread2.IsBackground = true; 
                thread1.Start("a method start\n"); 
                thread2.Start(); 
            } 
     
            private delegate void AddMessageDelegate(string message); 
            public void AddMessage(string message) 
            { 
                if (txt_Text.InvokeRequired)    //判断是否为非当前线程执行,如果返回true 说明不是当前线程执行的,则利用委托来访问控件。 
                { 
                    AddMessageDelegate d = AddMessage; 
                    txt_Text.Invoke(d, message); 
                } 
                else 
                    txt_Text.AppendText(message); 
            } 
     
            private void btn_Stop_Click(object sender, EventArgs e) 
            { 
                class1.shouldStop = true; 
                thread1.Join(0); 
                thread2.Join(0); 
            } 
        } 
    }

    下面是Class代码:

    namespace ThreadExample 

        class Class1 
        { 
            //volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。  
            //参考:http://msdn.microsoft.com/zh-cn/library/x13ttww7.aspx
     
            public volatile bool shouldStop; //标识线程是否停止,这里  true 代表停止 
            private Form1 form1; 
     
            public Class1(Form1 form) 
            { 
                this.form1 = form; 
            } 
     
            public void Method1(object obj) 
            { 
                string s = obj as string; 
                form1.AddMessage(s); 
                while (shouldStop == false) 
                { 
                    Thread.Sleep(100);  //当前线程休息100毫秒 
                    form1.AddMessage("a"); 
                } 
                form1.AddMessage("\n线程Method1已经停止"); 
            } 
     
            public void Method2() 
            { 
                while (shouldStop == false) 
                { 
                    Thread.Sleep(100); 
                    form1.AddMessage("b"); 
                } 
                form1.AddMessage("\n线程 Method2 已经停止"); 
            } 
        } 
    }

    例子下载地址:https://files.cnblogs.com/andrew-blog/ThreadExample.rar

  • 相关阅读:
    kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器
    解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
    电商网站商品模型之商品详情页设计方案
    大三那年在某宝8块钱买的.NET视频决定了我的职业生涯
    单点登录改进版-使用ajax分发cookie避免重定向轮询
    可跨域的单点登录(SSO)实现方案【附.net代码】
    使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
    js封装的三级联动菜单(使用时只需要一行js代码)
    EF查询之性能优化技巧
    EF使用CodeFirst方式生成数据库&技巧经验
  • 原文地址:https://www.cnblogs.com/dongzhaosheng/p/2773602.html
Copyright © 2020-2023  润新知