【发布时间】:2016-02-11 04:32:20
【问题描述】:
我使用 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 展示了如何使用应用程序上下文来挂钩启动屏幕行为。如果有好的参考资料,我也可以找到内部结构。
【问题讨论】:
-
不要这样做。使用 Startup 事件,如果您决定不需要单个实例,只需将 Me.SingleInstance 设置回 False。
-
@HansPassant 我知道所有现在都是同一进程下的线程。我在 C# 上做。想知道你为什么说“不要这样做”。我尝试了这个建议,但似乎我无法在运行时更改它第二个实例将等待第一个(实例化为单个实例)关闭然后启动新进程,直到它总是调用OnStartupNextInstance事件 。我认为 Visual Basic App Model 使用了一种互斥体的内部结构。我想运行一个实例(实例化为单个实例)和另一个实例作为新进程(实例化为不同的进程)。
-
“不要这样做”,因为你会打断你的腿。你会忘记 Application.EnableVisualStyles() 和 Application.SetUnhandledExceptionMode()。就像你做的那样。而且您很容易引发让 SystemEvents 类在错误的线程上触发其事件的恐怖,这非常难以诊断。让应用程序启动但等待第一个进程是一个坏主意。如果用户第 3 次或第 4 次启动它会怎样?或者第 n 次,因为“它不起作用”而疯狂地敲击快捷方式? WindowsFormsApplicationBase 不能帮助你做到这一点,你必须自己做饭。
-
只是我希望我的应用程序在我右键单击并在多个文件上调用命令并创建单个实例时聚合来自实例的命令行参数,并且在单个文件上调用时应该创建多个实例。您知道对此有更好的方法吗,我目前唯一的选择是 IPC。
-
一个 XY 问题。已经支持“聚合”,您的第一个实例获取 StartupNextInstance 事件,它的 e.CommandLine 属性包含新命令。
标签: c# .net multithreading single-instance