我以前没有在 WinForms 上编写过线程访问,但我已经用 PostSharp + Silverlight 完成了。因此,通过一些谷歌搜索,我会试一试。但不能保证它有效!
[Serializable]
public class OnGuiThreadAttribute : MethodInterceptionAspect
{
private static Control MainControl;
//or internal visibility if you prefer
public static void RegisterMainControl(Control mainControl)
{
MainControl = mainControl;
}
public override void OnInvoke(MethodInterceptionArgs eventArgs)
{
if (MainControl.InvokeRequired)
MainControl.BeginInvoke(eventArgs.Proceed);
else
eventArgs.Proceed();
}
}
这个想法是在您的应用程序开始时,使用属性注册您的主/根控件。然后你想确保在主线程上运行的任何方法,只需用[OnGuiThread]
. 如果它已经在主线程上,它只是运行该方法。如果不是,它会将方法调用作为委托异步提升到主线程。
编辑:我刚刚发现(为时已晚)您要求对正在使用的目标控件使用特定的调用方法。假设您在控件的子类上装饰实例方法:
[Serializable]
public class OnGuiThreadAttribute : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs eventArgs)
{
//you may want to change this line to more gracefully check
//if "Instance" is a Control
Control targetControl = (Control)eventArgs.Instance;
if (targetControl.InvokeRequired)
targetControl.BeginInvoke(eventArgs.Proceed);
else
eventArgs.Proceed();
}
}