Hello Mat

 找回密码
 立即注册
查看: 7163|回复: 0

C#多线程使用说明

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2019-4-20 23:01:22 | 显示全部楼层 |阅读模式
C#多线程
参考:https://www.cnblogs.com/dotnet261010/p/6159984.html
  1. //创建两个线程同时访问Sale方法
  2. Thread t1 = new Thread(new ThreadStart(book.Sale));
  3. Thread t2 = new Thread(new ThreadStart(book.Sale));
  4. //启动线程
  5. t1.Start();
  6. t2.Start();
复制代码
  1.   #region join test
  2.   public void MultiThreadTest()
  3.   {
  4.     Thread[] ths = new Thread[2];
  5.     ths[0] = new Thread(Method1);
  6.     ths[1] = new Thread(Method2);
  7.     foreach (Thread item in ths)
  8.     {
  9.       //首先让所有线程都启动
  10.       item.Start();
  11.       //试想一下在这里加上item.Join()可以达到我们所需要的效果吗?
  12.       //A:如果这阻塞了线程(启动item线程的线程,也就是主线程),那么启动了第一个线程之后
  13.       //主线程被阻塞,待线程1被执行完的时候再启动先一个线程。那么多线程就失去了意义,变成了同步。
  14.     }
  15.     foreach (Thread item in ths)
  16.     {
  17.       //数组中的所有子线程都对主线程进行阻塞,只是阻塞了启动
  18.       item.Join();
  19.       Thread.Sleep(1000);//用它来证明主线程是在启动了每一个子线程后才sleep的
  20.     }
  21.     Method3();
  22.   }
复制代码

2.5 跨线程访问
点击“测试”,创建一个线程,从0循环到10000给文本框赋值,代码如下:
  1. private void btn_Test_Click(object sender, EventArgs e)
  2.         {
  3.             //创建一个线程去执行这个方法:创建的线程默认是前台线程
  4.             Thread thread = new Thread(new ThreadStart(Test));
  5.             //Start方法标记这个线程就绪了,可以随时被执行,具体什么时候执行这个线程,由CPU决定
  6.             //将线程设置为后台线程
  7.             thread.IsBackground = true;
  8.             thread.Start();
  9.         }

  10.         private void Test()
  11.         {
  12.             for (int i = 0; i < 10000; i++)
  13.             {               
  14.                 this.textBox1.Text = i.ToString();
  15.             }
  16.         }
复制代码

运行结果:
产生错误的原因:textBox1是由主线程创建的,thread线程是另外创建的一个线程,在.NET上执行的是托管代码,C#强制要求这些代码必须是线程安全的,即不允许跨线程访问Windows窗体的控件。
解决方案:
1、在窗体的加载事件中,将C#内置控件(Control)类的CheckForIllegalCrossThreadCalls属性设置为false,屏蔽掉C#编译器对跨线程调用的检查。
  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3.         //取消跨线程的访问
  4.         Control.CheckForIllegalCrossThreadCalls = false;
  5. }
复制代码
使用上述的方法虽然可以保证程序正常运行并实现应用的功能,但是在实际的软件开发中,做如此设置是不安全的(不符合.NET的安全规范),在产品软件的开发中,此类情况是不允许的。如果要在遵守.NET安全标准的前提下,实现从一个线程成功地访问另一个线程创建的空间,要使用C#的方法回调机制。








算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-20 18:36 , Processed in 0.230712 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表