スレッドが他のスレッドのコントロールに直接アクセスできないと聞いたことがあります。ThreadPoolは他のスレッドのコントロールに直接アクセスできますか?
だから、私たちの教授は、私たちに
private void UpdateUI()
{
if(this.InvokeRequired)
this.Invoke(new MethodInvoker(UpdateUI));
else
this.Refresh();
}
スニペットを与え、それはスレッドがコントロールの所有者ではないし、我々は実行するために、所有者のスレッドを伝えるためにInvoke()
メソッドを呼び出す必要がありInvokeRequired
プロパティがfalseを返すと言っUpdateUI()
方法。その後、UIを更新します。
しかし、最近になって、ただ好奇心から、私はInvokeRequired
とInvoke()
private void UpdateUI()
{
//if(this.InvokeRequired)
//this.Invoke(new MethodInvoker(UpdateUI));
//else
this.Refresh();
}
をコメントし、ThreadPoolのは、別のスレッドのコントロールにアクセスすることができましたし、今私は、私は完全の概念を理解していないと感じていることを見て驚きましたThreadPool。
ここに完全なコードがあります。
using System;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;
class MainForm : Form
{
public MainForm()
{
this.Text = "Hello WinForms";
ThreadPool.QueueUserWorkItem(Clock);
}
private void Clock(object state)
{
for(;;)
{
Thread.Sleep(1000);
UpdateUI();
}
}
private void UpdateUI()
{
//if(this.InvokeRequired)
// this.Invoke(new MethodInvoker(UpdateUI));
//else
this.Refresh();
}
protected override void OnPaint(PaintEventArgs pe)
{
using(Pen pen = new Pen(Color.Red, 2))
pe.Graphics.DrawRectangle(pen, 20, 20, 125, 30);
pe.Graphics.DrawString(DateTime.Now.ToString(), this.Font, Brushes.Blue, 25, 30);
}
[STAThread]
public static void Main()
{
Application.Run(new MainForm());
}
}
私に説明してもらえますか?
ありがとうございました。
+1 @Searockあなたは 'OnPaint'メソッドで' Console.WriteLine(Thread.ManagedThreadId);を呼び出すことでその効果を見ることができるので、UIスレッドからのみ呼び出されることがわかります。 –