由于有了高级初始化场景(正如文档中警告的那样),我们正在利用ModuleInitializer属性在模块初始化时运行一些代码,如下所示.
[ModuleInitializer]
public static void InitModule() {
// Do something with the app here
}但是,根据加载模块的方式,我们发现了行为上的差异。特别是..。
Application.Current属性不是集。Application.Current属性是集。由于我们需要对当前应用程序进行部分初始化访问(仅当应用程序存在时,它不必立即运行),因此我们的初始方法是在初始化过程中,测试是否设置了Application.Current。如果是这样的话,就像往常一样使用它。如果不是,构建某种类型的“操作队列”,将我们想要运行的所有操作排队起来,然后从Application类的构造函数中处理该队列。
因此,上面的内容变成了.
[ModuleInitializer]
public static void InitModule() {
void appRelatedInitialization(Application application) {
// Do something with the app here
}
if(Application.Current is not null) {
appRelatedInitialization(Application.Current);
}
else {
// Add the method to a queue of actions which take an Application as an argument
Globals.AppInitQueue.Add(appRelatedInitialization);
}
}但是,我们遇到了一个不使用Application子类的应用程序,而是选择了一个main方法,并在那里完成了所有的应用程序配置。
当然,我们可以在那里添加队列处理,就像使用初始化器和子类一样,但是我们真正想要的是知道什么时候应用程序被实例化,而不管是什么类型的应用程序,并且让这个应用程序自动地为我们执行,这样我们就不必在任何地方添加它。
问题是,Application.Current是一个不使用INotifyPropertyChanged或类似的静态POCO属性,因此我们不确定如何确定什么时候设置了应用程序实例。我们也不想使用暴力轮询,因为这是最糟糕的一种代码气味。
那么,如何确定何时创建了当前的Application对象并将其分配给正在运行的进程?
发布于 2022-09-04 11:09:31
如果还没有创建当前线程,Dispatcher.CurrentDispatcher将为当前线程创建一个调度程序,这将由Application.Run()启动,因此您应该能够这样做
Dispatcher.CurrentDispatcher.BeginInvoke(() => {})我尝试过这样做,如果您将Dispatcher.Priority保留为默认值,它将在App构造函数和App_Startup被调用之后运行。
(如果您希望它更早地运行,您可以这样做 Dispatcher.CurrentDispatcher.BeginInvoke(() => {},DispatcherPriority.Send); 在这种情况下,它将在应用程序构建之后运行,但在App_Startup之前运行,尽管阅读了源代码,但由于一些bug,它们似乎显式地尝试首先运行OnStartup,而这正是为了避免这种情况。我不知道这样做的后果。)
https://stackoverflow.com/questions/73594385
复制相似问题