事件(com库) - 更新GUI

时间:2009-04-02 20:30:49

标签: c# com

我有一个金融图书馆(com),每次价格变动时都会召集一个事件。我订阅了这个事件并尝试更新文本框,但我总是得到一个跨线程操作。好吧,我使用委托,但它根本不起作用......它冻结了应用程序。我的假设是,在GUI有时间刷新之前,事件是快速调用的。知道如何处理这个问题吗?

我现在解决它的唯一方法就是把它放在:

CheckForIllegalCrossThreadCalls = false;

但我知道这是一种非常糟糕的做法......

我使用.Net 3.5和c#

编辑:委托代码

private delegate void UpdateTextBoxDelegate(String value);

private void UpdateTextBox(String value)
{
    this.txtPrice.Text = value;
}

txtPrice.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), price);

1 个答案:

答案 0 :(得分:0)

如果您正在使用事件,它应该自动编组到UI线程。这就是BackgroundWorker的工作原理。你必须发布你如何挂钩事件和事件回调本身。

您还可以在Invoke时尝试使用InvokeRequired == true

using System.ComponentModel;
public static class ISynchronizeInvokeExtensions
{
  public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke
  {
    if (@this.InvokeRequired)
    {
      @this.Invoke(action, new object[] { @this });
    }
    else
    {
      action(@this);
    }
  }
}

所以现在你可以在任何ISynchronizeInvoke上使用InvokeEx,并且能够访问实现类的属性和字段。

this.InvokeEx(f => f.txtPrice.Text = price);