zoukankan      html  css  js  c++  java
  • 多线程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

  • 相关阅读:
    第五十四天:jQuery内容的基础:
    第五十三天dom基础
    第五十二天js的·进阶
    第五十一天js的基础
    第四十九天css进阶
    第四十八天 html中的form和css基础
    第四十七天:web中德html初级:
    第42天IO模块
    第四十一天:协程操作
    第四十天线程的进阶
  • 原文地址:https://www.cnblogs.com/dongzhaosheng/p/2773602.html
Copyright © 2011-2022 走看看