我有一个金融图书馆(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);
答案 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);