Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有单实例和多实例行为的应用程序_C#_.net_Multithreading_Single Instance - Fatal编程技术网

C# 具有单实例和多实例行为的应用程序

C# 具有单实例和多实例行为的应用程序,c#,.net,multithreading,single-instance,C#,.net,Multithreading,Single Instance,我使用VisualBasic.dll创建了一个单实例应用程序,但在某些情况下,我需要创建多个实例。 我需要单实例行为来处理上下文菜单行为,其中每个windows上下文菜单命令将调用应用程序的新实例。我仍然需要一些上下文菜单来加载另一个实例。 我通过创建一个新的应用程序上下文并在一个新线程上运行它来解决这个问题 示例代码 var thread = new Thread(() => ThreadOpenFile(args)); thread.TrySetApartmentState(Apart

我使用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]));            
}
这将创建一个新的应用程序上下文线程上下文以及新表单应用程序。运行将线程上下文链接到应用程序上下文,就像启动一个新应用程序一样。我找不到任何文档来解释发生了什么以及谁在管理我正在创建的“新线程”。如果我尝试启动一个新流程,它将调用单实例处理程序

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
调用VisualBasic.dll,并按照预期永远在递归循环中运行。 我想知道这是正确的方法还是有更好的方法


这显示了如何使用应用程序上下文来钩住启动屏幕行为。如果有好的参考资料,我会发现里面的内容也很受欢迎。

接受@HansPassant对评论的回答

您将忘记Application.EnableVisualStyles()和Application.SetUnhandledExceptionMode()。就像你那样。而且您很容易调用让SystemEvents类在错误的线程上触发其事件的恐怖行为,这非常难以诊断。让应用程序启动,但等待第一个进程是一个相当糟糕的主意。如果用户第三次或第四次启动它怎么办?还是第n次


不要这样做。使用启动事件,如果您决定不需要单个实例,只需将Me.SingleInstance设置回False即可。@HansPassant我知道现在所有线程都在同一进程下。我在C#上做这件事。想知道你为什么说“不要这样做”。我尝试了这个建议,但似乎无法在运行时对其进行更改。第二个实例将等待第一个实例(实例化为单个实例)关闭,然后启动新流程,直到它始终调用OnStartupNextInstance事件。我认为VisualBasic应用程序模型使用了互斥类型的内部结构。我想运行一个实例(实例化为一个实例),另一个实例作为一个新的进程(实例化为一个不同的进程)。“不要这样做”,因为这样会让你的腿发麻。您将忘记Application.EnableVisualStyles()和Application.SetUnhandledExceptionMode()。就像你那样。而且您很容易调用让SystemEvents类在错误的线程上触发其事件的恐怖行为,这非常难以诊断。让应用程序启动,但等待第一个进程是一个相当糟糕的主意。如果用户第三次或第四次启动它怎么办?或者第n次,因为“它不工作”而疯狂地敲打捷径?WindowsFormsApplicationBase不能帮助您做到这一点,您必须自己做饭。我只想让我的应用程序在右键单击并调用多个文件上的命令并创建单个实例时,从实例聚合命令行参数,并在单个文件上调用时,应创建多个实例。你知道更好的方法吗?我现在唯一的选择是IPC。真是个问题。已支持“聚合”,您的第一个实例将获得StartupNextInstance事件,其e.CommandLine属性包含新命令。