2014-02-17 42 views
3

那么我使用ReactiveExtensions eventhandler来处理我的应用程序事件,我也使用ControlScheduler为了在UI线程上运行处理程序。然而,最近我得到跨线程异常尽管使用ControlScheduler,我不知道是什么问题无功扩展ControlScheduler

代码:

Observable.FromEventPattern<string>(cc, "UiAlertMessage", new ControlScheduler(this)).Subscribe(_ => 
{ 
    AlertControl.Show(this, Language.Title, _.EventArgs.UppercaseFirst()); 
}); 

不应该运行在UI线程的代码new ControlScheduler(this)所以我没有得到交叉线程异常?

回答

4

你应该做

Observable.FromEventPattern<string>(cc, "UiAlertMessage") 
    .ObserveOn(this) 
    .Subscribe(_ => 
    { 
     AlertControl.Show(this, Language.Title, _.EventArgs.UppercaseFirst()); 
    }); 

这是指派给相关的具体的控制调度的标准方法。按照控制上的subscribes而不是observes的方式传递控制权。这种差异ObserverOnSubscribeOn之间

ObserveOn的实施是从System..Reactive.Windows.Forms装配见this answer

public static IObservable<TSource> ObserveOn<TSource> 
(this IObservable<TSource> source, Control control) 
{ 
    if (source == null) 
    throw new ArgumentNullException("source"); 
    if (control == null) 
    throw new ArgumentNullException("control"); 
    else 
    return Synchronization.ObserveOn<TSource>(source, (IScheduler) new ControlScheduler(control)); 
} 
+1

另外,[见本](http://stackoverflow.com/questions/20451939/observeon-and-subscribeon-where-the-work-is-being-done)用于'ObserveOn'的说明 - 核心问题是您正在订阅调度程序而不是观察它。 –

+0

@JamesWorld我会更新答案来反映这一点。钽 – bradgonesurfing