2014-03-29 218 views
0
private readonly CoreDispatcher dispatcher; 

我在构造函数中将上面的字段初始化为CoreWindow.GetForCurrentThread()。Dispatcher; 后来我包裹着它的功能:静态字段初始化

public async Task OnUiThread(Action action) 
{ 
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => action()); 
} 

,并使用此功能whneva required.It正常工作转移到UIThread电话。

由于我是我的应用程序的每个页面上这样做,我决定rathar机的静态类说

public static class ThreadManager 
{ 
    private static readonly CoreDispatcher dispatcher; 

    static ThreadManager() 
    { 
     dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
    } 

    public static async Task OnUiThread(Action action) 
    { 
     await dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => action()); 
    } 
} 

但现在当我尝试使用此我的网页上,以呼叫转移到UI线程我,获取对象空的异常和分派器在其他页面上的任何地方都显示为空,然后我调用这个静态类。为什么?

回答

2

嗯,你正在初始化CoreDispatcher基于哪个线程发生初始化类。考虑到你真的希望为特定的调度员完成,这感觉对我来说这是一个坏主意。

鉴于您在页面中使用此功能,您不能使用调度程序代替该页面吗?我不明白你为什么需要一个dispatcher变量......你可能会考虑写一个OnUiThread的扩展方法。

此外,您并不需要在此处使用async/await或lambda表达式。您可以使用:

public static Task OnUiThread(this CoreDispatcher dispatcher, Action action) 
{ 
    return dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
           new DispatchedHandler(action)) 
        .AsTask(); 
}