多執行緒學習(二)

Heliooo發表於2019-06-24

之前的多執行緒Demo都是在輸出到控制檯的情況下進行的,那麼,如果我們將程式執行結果輸出到控制元件會發生什麼事情呢?下面一起來看程式碼吧。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 執行緒訪問控制元件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Test()
        {
            for (int i = 0; i < 10000; i++)
            {
                //執行緒訪問控制元件
                textBox1.Text = i.ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //建立一個執行緒去執行這個方法
            Thread th = new Thread(Test);

            //將執行緒設定為後臺執行緒
            th.IsBackground = true;

            //標記這個執行緒準備就緒了,可以隨時被執行,具體什麼時候執行這個執行緒,由CPU決定
            th.Start();
        }
    }
}

執行結果丟擲了“執行緒間操作無效: 從不是建立控制元件“textBox1”的執行緒訪問它。”的異常。


這是因為在.NET中預設是不允許跨執行緒訪問的,我們新開了一個執行緒來訪問主執行緒的控制元件,所以丟擲了異常。那麼怎麼辦?

可以在窗體載入的時候就將跨執行緒訪問的檢查機制給關掉,這樣我們就可以跨執行緒訪問控制元件了。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 執行緒訪問控制元件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //取消跨執行緒的訪問檢查
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        public void Test()
        {
            for (int i = 0; i < 10000; i++)
            {

                
                //執行緒訪問控制元件
                textBox1.Text = i.ToString();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //建立一個執行緒去執行這個方法
            Thread th = new Thread(Test);

            //將執行緒設定為後臺執行緒
            th.IsBackground = true;

            //標記這個執行緒準備就緒了,可以隨時被執行,具體什麼時候執行這個執行緒,由CPU決定
            th.Start();
        }
    }
}

此時,再執行我們的程式,就發現問題已經解決了,程式可以正常訪問控制元件了。



相關文章