在非派生自 System.Windows.Forms.Control 的类中,可以使用 SynchronizationContext 来确保线程安全地更新用户界面控件。以下是一个示例:
using System;
using System.Threading;
using System.Windows.Forms;
public class MyForm : Form
{
private Label myLabel;
public MyForm()
{
myLabel = new Label() { Location = new System.Drawing.Point(10, 10), Width = 200 };
this.Controls.Add(myLabel);
}
public void UpdateLabelText(string text)
{
if (myLabel.InvokeRequired)
{
myLabel.Invoke(new Action<string>(UpdateLabelText), text);
}
else
{
myLabel.Text = text;
}
}
}
public class MyClass
{
private readonly SynchronizationContext _context;
public MyClass()
{
_context = SynchronizationContext.Current;
}
public void DoWork(MyForm form)
{
// 模拟在后台线程中执行一些工作
ThreadPool.QueueUserWorkItem(_ =>
{
Thread.Sleep(2000); // 模拟一些工作
// 使用 SynchronizationContext 切换到 UI 线程
_context.Post(__ =>
{
form.UpdateLabelText("更新后的文本");
}, null);
});
}
}
// 示例用法
public static class Program
{
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MyForm form = new MyForm();
MyClass myClass = new MyClass();
Application.Run(form);
// 开始后台工作
myClass.DoWork(form);
}
}
在这个示例中,MyClass 类使用 SynchronizationContext 来确保在 UI 线程上更新控件。DoWork 方法在后台线程中执行一些工作,然后使用 _context.Post 方法将更新操作切换到 UI 线程上。这样可以确保在非派生自 System.Windows.Forms.Control 的类中安全地更新用户界面控件。