Halcom 发表于 2019-4-20 23:01:22

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]
查看完整版本: C#多线程使用说明