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();
复制代码- #region join test
- public void MultiThreadTest()
- {
- Thread[] ths = new Thread[2];
- ths[0] = new Thread(Method1);
- ths[1] = 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 跨线程访问 点击“测试”,创建一个线程,从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();
- }
- }
复制代码
运行结果: 产生错误的原因: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#的方法回调机制。
|