met*_*cam 3 wpf state vsto class-library dispatcher
我创建了一个加载项,通过反射调用WPF类库.由于这是一个类库,我不得不手动实例化new System.Windows.Application().
然后,类构造函数(通过反射调用的那个)创建一个窗口,并使用Show()(使用Dispatcher.Run()来避免窗口立即关闭)或ShowDialog().
由于我的应用程序是一个加载项,Application仍然存在.因此,我只能将这种情况实例化一次.
在第一次启动时(Application is instanciated),Application.Current.Dispatcher正在运行.
但在第二次发布时,我确定Application.Current.Dispatcher已停止.我从不调用InvokeShutdown()所以我不明白Dispatcher何时停止.
当我第二次启动时,应用程序已经实现(这是正常的)但Dispatcher已停止.
任何的想法 ?谢谢 !
编辑:在我的加载项中,我尝试了两种方法:
第一种方式:
foreach (Type type in ass2_l.GetTypes())
{
if (type.Name == "Loader")
{
object obj_l = Activator.CreateInstance(type);
BindingFlags bf_l = BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
object[] argList_l = new object[1];
argList_l[0] = "ok";
type.InvokeMember("Load", bf_l, null, obj_l, argList_l);
}
}
Run Code Online (Sandbox Code Playgroud)
当我从加载项直接调用dll时,Application.Current.Dispatcher处于后台状态,名称为"VSTA_Main".当我第二次启动时,Dispatcher仍然处于后台状态.
第二种方式:
t_m = new Thread(loadDll);
t_m.SetApartmentState(ApartmentState.STA);
t_m.Start();
Run Code Online (Sandbox Code Playgroud)
loadDll实际上包含"第一路"代码的相同代码.当我第一次启动这个部件时,Dispatcher正在运行,一切都很正常.第二次启动时,Dispatcher停止.
编辑2: 问题在于第二种方式.当loadDll完成然后我再次单击我的加载项按钮时,t_m停止并创建另一个不能解决问题,因为Dispatcher ManagedThreadId具有旧的t_m ManagerThreadId:/
编辑3: 问题肯定不是由加载项引起的.如果您只是创建一个程序,每次单击按钮时启动一个线程.该线程尝试实现DLL WPF类库(通过反射),如果您再次单击此按钮(调用另一个线程),因为Dispatcher仍然"链接"到旧线程,Dispatcher将"停止" (像旧线程一样)
在ThisAddin.Startup事件处理程序中输入以下代码:
private void ThisAddInStartup(object sender, EventArgs e)
{
if (System.Windows.Application.Current == null)
new System.Windows.Application();
System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown
}
Run Code Online (Sandbox Code Playgroud)
应该解决它,它在过去对我来说工作得很好..
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |