C# 事件(com库)-更新GUI
我有一个金融图书馆(com),每当价格发生变化时,它都会调用一个事件。我订阅了这个事件并尝试更新一个文本框,但我总是得到一个跨线程操作。好的,我使用委托,但它根本不起作用。。。这是冻结应用程序。我的假设是,在GUI有时间刷新之前,事件被快速调用。你知道我该怎么处理吗 我现在唯一的解决办法是:C# 事件(com库)-更新GUI,c#,com,C#,Com,我有一个金融图书馆(com),每当价格发生变化时,它都会调用一个事件。我订阅了这个事件并尝试更新一个文本框,但我总是得到一个跨线程操作。好的,我使用委托,但它根本不起作用。。。这是冻结应用程序。我的假设是,在GUI有时间刷新之前,事件被快速调用。你知道我该怎么处理吗 我现在唯一的解决办法是: CheckForIllegalCrossThreadCalls = false; 但我知道这是一个非常糟糕的做法 我使用.NET3.5和c# 编辑:代理代码 private delegate void U
CheckForIllegalCrossThreadCalls = false;
但我知道这是一个非常糟糕的做法
我使用.NET3.5和c#
编辑:代理代码
private delegate void UpdateTextBoxDelegate(String value);
private void UpdateTextBox(String value)
{
this.txtPrice.Text = value;
}
txtPrice.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), price);
如果您正在使用事件,它应该自动封送到UI线程。这就是
BackgroundWorker
的工作原理。您必须发布如何钩住事件和事件回调本身
当invokererequired==true
时,也可以尝试使用Invoke
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);
}
}
}
this.InvokeEx(f => f.txtPrice.Text = price);