2009-04-02 11 views
0

価格が変更されるたびにイベントを呼び出す金融ライブラリ(com)があります。私はこのイベントを購読してテキストボックスを更新しようとしましたが、私は常にクロススレッド操作を取得します。さて、私はデリゲートを使用しますが、それはまったく動作しません...アプリケーションをフリーズしています。私の仮説は、GUIがリフレッシュする時間が来る前に、イベントがすぐに呼び出されるということです。どのように私はそれに対処できる任意のアイデア?イベント(com library) - アップデートGUI

私は今、それがそれを置くためにのためにそれを解決する唯一の方法:

CheckForIllegalCrossThreadCalls = false; 

が、私はそれが非常に悪い習慣を知っている...

私はC#

で.NET 3.5を使用します編集:デリゲートコード

private delegate void UpdateTextBoxDelegate(String value); 

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

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

答えて

0

イベントを使用している場合は、UI thrにマーシャリングする必要があります自動的にead。それがBackgroundWorkerの仕組みです。あなたは、イベントとイベントコールバック自体にどのようにフックを投稿する必要があります。

InvokeRequired == 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); 
    } 
    } 
} 

だから今、あなたはどのISynchronizeInvoke上InvokeExを使用し、クラスを実装するためのプロパティとフィールドにアクセスできるようにすることができます。

this.InvokeEx(f => f.txtPrice.Text = price); 
関連する問題