问题描述
|
我已经创建了一个加载项,它通过WPF类库Reflection进行调用。
由于这是一个类库,因此我不得不手动实例化一个“ 0”。
然后,类构造函数(通过反射调用的类)创建一个窗口,并设置Show()(使用dispatcher.Run()以避免窗口立即关闭)或ShowDialog()。
由于我的应用程序已添加到加载项中,因此该应用程序仍然有效。
因此,我只能实例化一次。
在首次启动(实例化Application)时,Application.Current.dispatcher正在运行。
但是在第二次启动时,我断言Application.Current.dispatcher已停止。
我从不调用InvokeShutdown(),所以我不了解dispatcher何时停止。
当我第二次启动此程序时,应用程序已经实例化(正常),但是dispatcher停止了。
任何想法 ?
谢谢 !
编辑:在我的加载项中,我尝试了2种方法:
第一种方式:
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);
}
}
当我直接从外接程序调用dll时,Application.Current.dispatcher处于后台状态,名称为“ vsta_Main \”。
当我第二次启动时,dispatcher仍处于后台状态。
第二种方式:
t_m = new Thread(loadDll);
t_m.SetApartmentState(ApartmentState.STA);
t_m.Start();
loadDll实际上包含与“第一种方式”代码相同的代码。
当我第一次启动此部分时,调度程序正在运行,并且一切都非常正常。
第二次启动时,dispatcher停止。
编辑2:
问题出在第二种方式。
当loadDll完成后,我再次单击我的加载项按钮时,t_m停止并且创建另一个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
}
那应该解决,过去对我来说效果很好。
, 最后,我使用无限循环将线程保持在运行状态,并使用AutoResetEvent / ManualResetEvent来启动/停止线程,从而解决了问题。
由于线程永远不会结束(并在接收到start事件时调用加载WPF UI dll的方法),因此我们永远不会停止线程(直到我们停止外接程序),并且调度程序也永远不会停止。
顺便说一句,谢谢你的所有回答:)