2012-05-25 36 views
0

我需要在UI线程中引发事件,我发现的所有解决方案都只用于完整框架:例如使用GetInvocationList和ISynchronizeInvoke的非常简单的解决方案,但NET CF不支持ISynchronizeInvoke。有什么办法在UI线程中为CF引发事件吗?我的代码如下。我使用.NET CF 3.5在UI线程中引发事件

class Publisher { 
    public event EventHandler OnEventHandler; 
    private void OnEvent() 
    { 
    var handler = OnEventHandler; 
    if (handler != null) handler(this, EventArgs.Empty); 
    } 
} 
+0

你必须通过构造函数传递控制基准,所以你可以使用它的invoke()方法引发事件。事件订阅者处理它肯定比较容易。 –

+0

是的,我了解控件引用,但我不喜欢这种情况,因为Publisher对UI,控件等一无所知。另外,视图可能在创建Publisher后创建。 – wince

+1

对,它调用了“它当然更容易”的条款。这并非前所未有的,例如,SerialPort在另一个线程上引发事件。 –

回答

0

我使用MethodInvoker,它都将被声明(因为它不紧凑的框架下存在),然后包括一个链接到父控制(通常的主要形式):

class Publisher { 
    #if PocketPC // MethodInvoker delegate is not declared in CF! 
    public delegate void MethodInvoker(); 
    #endif 
    private Form _parent; 

    public Publisher(Form parent) { 
    _parent = parent; 
    } 

    public event EventHandler OnEventHandler; 
    private void OnEvent() { 
    if (OnEventHandler != null) { 
     MethodInvoker mi = delegate { OnEventHandler(this, EventArgs.Empty); }; 
     try { 
     _parent.BeginInvoke(methInvoker); 
     } catch (ObjectDisposedException) { 
     } catch (NullReferenceException err) { 
     LogError("OnEvent NullReference", err); 
     } catch (InvalidOperationException err) { 
     LogError("OnEvent InvalidOperation", err); 
     } 
    } 
    } 
} 

希望你能做些什么。 ;)

〜乔

+0

Woops。我刚刚阅读了你发布给汉斯的关于不希望发布者订阅活动的评论。任何投票删除这个答案或留在这里为他人获得? – jp2code

+0

我知道我需要一些控件的实例来使用invoke方法。所以,现在我的发布商可以实现这种控制,并且您的解决方案很好。谢谢。 – wince