C#多线程使用说明
C#多线程参考:https://www.cnblogs.com/dotnet261010/p/6159984.html
//创建两个线程同时访问Sale方法
Thread t1 = new Thread(new ThreadStart(book.Sale));
Thread t2 = new Thread(new ThreadStart(book.Sale));
//启动线程
t1.Start();
t2.Start();也可参考:https://www.cnblogs.com/zhangchenliang/p/4515937.html #region join test
public void MultiThreadTest()
{
Thread[] ths = new Thread;
ths = new Thread(Method1);
ths = new Thread(Method2);
foreach (Thread item in ths)
{
//首先让所有线程都启动
item.Start();
//试想一下在这里加上item.Join()可以达到我们所需要的效果吗?
//A:如果这阻塞了线程(启动item线程的线程,也就是主线程),那么启动了第一个线程之后
//主线程被阻塞,待线程1被执行完的时候再启动先一个线程。那么多线程就失去了意义,变成了同步。
}
foreach (Thread item in ths)
{
//数组中的所有子线程都对主线程进行阻塞,只是阻塞了启动
item.Join();
Thread.Sleep(1000);//用它来证明主线程是在启动了每一个子线程后才sleep的
}
Method3();
}
2.5 跨线程访问https://images2015.cnblogs.com/blog/1033738/201612/1033738-20161211165843304-141162350.png点击“测试”,创建一个线程,从0循环到10000给文本框赋值,代码如下:private void btn_Test_Click(object sender, EventArgs e)
{
//创建一个线程去执行这个方法:创建的线程默认是前台线程
Thread thread = new Thread(new ThreadStart(Test));
//Start方法标记这个线程就绪了,可以随时被执行,具体什么时候执行这个线程,由CPU决定
//将线程设置为后台线程
thread.IsBackground = true;
thread.Start();
}
private void Test()
{
for (int i = 0; i < 10000; i++)
{
this.textBox1.Text = i.ToString();
}
}
运行结果:https://images2015.cnblogs.com/blog/1033738/201612/1033738-20161211170247710-1207822491.png产生错误的原因:textBox1是由主线程创建的,thread线程是另外创建的一个线程,在.NET上执行的是托管代码,C#强制要求这些代码必须是线程安全的,即不允许跨线程访问Windows窗体的控件。解决方案:1、在窗体的加载事件中,将C#内置控件(Control)类的CheckForIllegalCrossThreadCalls属性设置为false,屏蔽掉C#编译器对跨线程调用的检查。private void Form1_Load(object sender, EventArgs e)
{
//取消跨线程的访问
Control.CheckForIllegalCrossThreadCalls = false;
}使用上述的方法虽然可以保证程序正常运行并实现应用的功能,但是在实际的软件开发中,做如此设置是不安全的(不符合.NET的安全规范),在产品软件的开发中,此类情况是不允许的。如果要在遵守.NET安全标准的前提下,实现从一个线程成功地访问另一个线程创建的空间,要使用C#的方法回调机制。
页:
[1]