1

我正在编写一个大量使用线程的类库,我想将线程安全带入库中,而不是让我们的代码必须自己实现线程安全的开发人员。

我有一个活动

public delegate void OnPostHandler();
public event OnPostHandler OnPost;

和一个方法

public void FireEvent() {
    Delegate[] delegate_list = OnPost.GetInvocationList();
    foreach (OnPostHandler d in delegate_list)
    {
       //detect if d.Target is a System.Windows.Forms.Control
       Type formType = Type.GetType("System.Windows.Forms.Control, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
       if(formType != null) {
           //need to cast d.Target to System.Windows.Forms.Control WITHOUT referencing System.Windows.Forms.Control
           if(d.Target.InvokeRequired) {
               d.Target.Invoke(d);
           } else {
               d();
           }
       } else {
           d();
       }
    }
}

FireEvent,我想转换d.Target为 aSystem.Windows.Forms.ControlSystem.Windows.Forms.Control不是代码中的指定转换,如果可能的话,我希望这样做,formType这样我就不会被迫自己链接表单程序集,因为它不是库的要求,并且不应该是。

或者,有没有更好的方法来做我想做的事情?

4

2 回答 2

1

通过反射,您可以:

Delegate[] delegate_list = OnPost.GetInvocationList();

Type formType = Type.GetType("System.Windows.Forms.Control, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
var invokeRequiredProp = formType.GetProperty("InvokeRequired");

foreach (OnPostHandler d in delegate_list)
{
    if(formType != null) {
        var invokeRequired = invokeRequiredProp.GetValue(d.Target, null);
        if (invokeRequired) {
            formType.GetMethod("Invoke").Invoke(d.Target, new object[]{d});
        } 
        else {
           d();
       }
    } else {
        d();
    }
}

GetMethodGetProperty方法可能需要BindingFlags参数。

没有反射,你可以使用ISynchronizeInvoke

Delegate[] delegate_list = OnPost.GetInvocationList();

foreach (OnPostHandler d in delegate_list)
{
    var form = d.Target as ISynchronizeInvoke;
    if(form != null && form.InvokeRequired) {
      form.Invoke(d);
    } 
    else {
       d();
    }
}
于 2013-07-03T13:04:46.907 回答
0

使用界面ISynchronizeInvoke。它位于System并由System.Windows.Forms.Control.

于 2013-07-03T13:03:27.303 回答