なぜマルチスレッドインタフェースを使用して偽死したのですか?
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という方法を一度に完全に実行することです.ずっと中にとどまって実行するのではありません.インタフェースのリフレッシュを実現します.
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();
}
}
}
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();
}
}
}