在Winform中,WndProc是窗口過程,負責處理窗口消息。在多線程中,如果需要在其他線程中更新UI控件,需要通過Invoke方法來在UI線程中執行相應的代碼。下面是一個示例代碼,演示了如何在多線程中更新UI控件:
using System;
using System.Threading;
using System.Windows.Forms;
namespace MultiThreadWinform
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void UpdateLabel(string text)
{
if (label1.InvokeRequired)
{
label1.Invoke(new Action<string>(UpdateLabel), text);
}
else
{
label1.Text = text;
}
}
protected override void WndProc(ref Message m)
{
const int WM_USER = 0x0400;
const int WM_UPDATE_LABEL = WM_USER + 1;
switch (m.Msg)
{
case WM_UPDATE_LABEL:
UpdateLabel("Update by WndProc");
break;
}
base.WndProc(ref m);
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() =>
{
Thread.Sleep(2000);
this.BeginInvoke(new Action(() =>
{
UpdateLabel("Update by thread");
}));
this.Invoke(new Action(() =>
{
this.BeginInvoke(new Action(() =>
{
this.WndProc(ref Message.Create(this.Handle, WM_UPDATE_LABEL, IntPtr.Zero, IntPtr.Zero));
}));
}));
});
thread.Start();
}
}
}
在上面的示例代碼中,通過Override WndProc方法,定義了一個自定義的窗口消息WM_UPDATE_LABEL,當收到這個消息時,會調用UpdateLabel方法更新UI控件。在button1_Click事件中,啟動一個新線程,在新線程中通過Invoke和BeginInvoke方法更新UI控件,并向WndProc發送自定義消息來更新UI控件。這樣就實現了在多線程中更新UI控件的功能。