静态场初始化

时间:2014-03-29 13:05:18

标签: constructor static c#-5.0

private readonly CoreDispatcher dispatcher;

我正在构造函数中将上面的字段初始化为CoreWindow.GetForCurrentThread()。Dispatcher; 然后我用它包裹了一个函数:

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

并使用此功能将调用转移到所需的UIThread whneva。它工作正常。

因为我在我的应用程序的每个页面上都这样做,所以我决定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线程时,我得到了对象null异常,并且调度程序在其他页面上显示为null,其中我调用了这个静态类。为什么?

1 个答案:

答案 0 :(得分: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();
}