多线程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