なぜマルチスレッドインタフェースを使用して偽死したのですか?

3014 ワード

なぜマルチスレッドインタフェースを使用して偽死したのですか?


ここに2つの項目が貼られています(テスト済み).
不正なマルチスレッドを先に貼り付ける
図のように設計されています.
ネームスペースの導入:
using System.Threading;

完全なコード:
namespace ThreadTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Start_Click(object sender, EventArgs e)
        {
            Thread myThread = new Thread(ThreadStart);
            myThread.IsBackground = true;   // 
            myThread.Start();
        }

        ///ThreadStart 
        private delegate void ThreadStartDelegate();
        /// 
        ///  
        /// 
        private void ThreadStart()
        {
            if (txt_Text.InvokeRequired)
            {
                ThreadStartDelegate d = ThreadStart;
                txt_Text.Invoke(d);
            }
            while (true)
            {
                Thread.Sleep(100);
                txt_Text.Text += "a";
                // ,    blog 
                Application.DoEvents();
            }
        }

        private void btn_Exit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

以上のコードを考えてみると、スレッドが呼び出されると、このスレッドはずっとThreadStartの中で走っていて、この方法も完全に実行されていません(インタフェースは更新されませんが)、偽死に達します.
インタフェースが偽死せずにマルチスレッドの目的を達成するために.このThreadStartメソッドを操作するために、このメソッドを実行し続ける方法を追加する必要があります.
次は正しいコードの違いです.
図のように設計されています.
ネームスペースの導入:
using System.Threading;

完全なコード:
namespace ThreadTest2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Start_Click(object sender, EventArgs e)
        {
            Thread myThread = new Thread(ThreadMethod);
            myThread.IsBackground = true;
            myThread.Start();
        }

        /// 
        ///  
        /// 
        private void ThreadMethod()
        {
            while (true)
            {
                Thread.Sleep(100);  // 100 
                ThreadStart();
            }
        }

        private delegate void ThreadStartDelegate();
        /// 
        ///  
        /// 
        private void ThreadStart()
        {
            if (txt_Text.InvokeRequired)
            {
                ThreadStartDelegate d = ThreadStart;
                txt_Text.Invoke(d);
            }
            else
            {
                txt_Text.Text += "a";
            }
        }

        private void btn_Exit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

この使い方は正しいですが、最大の違いは、ThreadStartという方法を一度に完全に実行することです.ずっと中にとどまって実行するのではありません.インタフェースのリフレッシュを実現します.