我使用VisualBasic.dll创建了一个单实例应用程序,但在某些情况下我需要创建多个实例。 我需要单实例行为来处理上下文菜单行为,其中每个Windows上下文菜单命令将调用应用程序的新实例。我仍然需要一些上下文菜单来加载另一个实例。 我通过创建一个新的应用程序上下文并在新线程上运行它来解决这个问题。
示例代码
var thread = new Thread(() => ThreadOpenFile(args));
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();
线程内容
private static void ThreadOpenFile(string[] args)
{
ApplicationContext appCnxt= new ApplicationContext(new newForm(args[1]));
Application.Run(appCnxt);
}
我与
相同private static void ThreadOpenFile(string[] args)
{
Application.Run(new newForm(args[1]));
}
这将创建一个新的 ApplicationContext , ThreadContext ,新表单和 Application.Run 将链接ThreadContext到ApplicationContext就像启动一个新的应用程序一样。我找不到任何文档来解释发生了什么以及谁正在管理我正在创建的这个“新线程”。如果我尝试启动一个新进程,它将调用单实例处理程序
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
VisualBasic.dll的并按预期永远进入递归循环。 我想知道这是正确的方法,还是有更好的方法?
此link显示了如何使用应用程序上下文来挂钩Splash屏幕行为。如果有好的参考资料我会发现内部也很受欢迎。
答案 0 :(得分:0)
接受@HansPassant对评论的回答。
您将忘记Application.EnableVisualStyles()和Application.SetUnhandledExceptionMode()。像你一样。并且你很容易调用让SystemEvents类在错误的线程上触发事件的恐怖,过分难以诊断。让应用程序启动但等待第一个进程是一个糟糕的主意。如果用户第3次或第4次启动该怎么办?或者第n次