image.png
    image.png
    image.png

    在.Net下,是不允许跨线程访问的。
    image.png
    image.png

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading;
    9. using System.Threading.Tasks;
    10. using System.Windows.Forms;
    11. namespace _120_多线程
    12. {
    13. public partial class Form1 : Form
    14. {
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. }
    19. Thread th;
    20. private void button1_Click(object sender, EventArgs e)
    21. {
    22. //Thread.Sleep(3000);
    23. //Test();//会出现假死状态,主线程被占用,其他操作无法使用
    24. //创建一个线程去执行这个方法
    25. th = new Thread(Test);//前台线程
    26. Console.WriteLine(th);
    27. //Console.WriteLine(th.IsBackground);
    28. //将线程设置为后台线程
    29. th.IsBackground = true;
    30. //Console.WriteLine(th.IsBackground);
    31. th.Start();//标记这个线程准备就绪了,可以随时被执行。(由cpu执行)
    32. }
    33. public void Test()
    34. {
    35. for (int i = 0; i < 100000; i++)
    36. {
    37. //Console.WriteLine(i);
    38. textBox1.Text = i.ToString();
    39. //System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。” Test方法不是主线程
    40. //System.ComponentModel.Win32Exception:“创建窗口句柄时出错。” 在关闭程序时,文本框已经没了,但是某些原因,这里并没有马上结束还要输出,所以出错
    41. }
    42. }
    43. private void Form1_Load(object sender, EventArgs e)
    44. {
    45. //取消不可跨线程访问
    46. Control.CheckForIllegalCrossThreadCalls = false;
    47. }
    48. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    49. {
    50. //当你点击关闭窗口的时候,判断线程是否为null
    51. if (th != null)
    52. {
    53. //th.Abort();//线程被Abort后就不能被Start了
    54. th = null;
    55. }
    56. }
    57. }
    58. }