在单个线程上开始另一个消息循环是无效操作

那该多好啊!!! 2020-06-28 01:55:10
当运行到时就报下面的错误 Application.Run(new frmMain());



System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生

其他信息: 在单个线程上开始另一个消息循环是无效操作。请改用 Form.ShowDialog。
...全文
4779 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
圣殿骑士18 2020-06-29
  • 打赏
  • 举报
回复
把你整个代码拷贝过来,屏蔽掉这句话:UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 后,运行没有问题。 屏蔽上面那句话的原因是,没有相关代码,编译不通过。也不知道它是否影响了你的代码。
正怒月神 2020-06-29
  • 打赏
  • 举报
回复
frmMain 里面还有一个static void Main()??? 把这个main删掉。 应用程序,只允许有一个static void Main()函数。
八爻老骥 2020-06-29
  • 打赏
  • 举报
回复 1
Application.Run(new frmMain());只能在主线程里做,一个应用程序只能有一个主窗体,Run的作用就是在这个主窗体上起用消息循环,其它地方显示窗口要使用Show或ShowDialog,想深入了解的话要学一下Win32编程。
圣殿骑士18 2020-06-29
  • 打赏
  • 举报
回复
引用 12 楼 那该多好啊!!! 的回复:
[quote=引用 10 楼 圣殿骑士18 的回复:] 把你整个代码拷贝过来,屏蔽掉这句话:UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 后,运行没有问题。 屏蔽上面那句话的原因是,没有相关代码,编译不通过。也不知道它是否影响了你的代码。
那句话我忘记删除了,本来是注释掉的[/quote] 我测试你的代码没有问题。 按p哥的说法,我也是这么做的,不要去动系统生成的代码,这是编码素养。 我的写法:
static void Main()
{
    AppManager.Initial();

    //防止重复启动
    Process[] processcollection = Process.GetProcessesByName(AppManager.AppProjectId);
    if (processcollection.Length > 1)   //注意:使用>1是对的,因为当前判断时,已经是已启动的第二个程序
    {
        MessageBox.Show("程序已启动,它可能已被最小化为任务栏图标。");
        Environment.Exit(1);
        return;
    }

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormMain(autoStart));
}
  • 打赏
  • 举报
回复
另外,要检测进程,直接使用 Process 检测当前系统中的进程集合,或者直接用一个“文本文件”来互斥各个进程实例就行了,何必要使用 Mutex 呢?


技术有害。我就反对滥用技术套路,技术堆砌得越多越坏。
  • 打赏
  • 举报
回复
如果要检测是否有别的进程已经启动,顶多在原来的 Main 过程代码最开始“插入”一行检查一下就行了,你何必要去修改原来产生的代码呢?
  • 打赏
  • 举报
回复
引用 9 楼 正怒月神 的回复:
frmMain 里面还有一个static void Main()??? 把这个main删掉。 应用程序,只允许有一个static void Main()函数。
不明白
  • 打赏
  • 举报
回复
引用 10 楼 圣殿骑士18 的回复:
把你整个代码拷贝过来,屏蔽掉这句话:UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 后,运行没有问题。 屏蔽上面那句话的原因是,没有相关代码,编译不通过。也不知道它是否影响了你的代码。
那句话我忘记删除了,本来是注释掉的
  • 打赏
  • 举报
回复
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> /// public static WarningSettings WarningPara = new WarningSettings(); public static bool DemoGrabOn = false; public static string GetParaFileName(int productID) { return string.Format("{0}{1}\\Paras.dat", ParaDir,productID); } public static string GetDotParaFileName(int productID,int camIndex) { return string.Format("{0}{1}\\Para-{2}.dat", ParaDir, productID, camIndex); } [STAThread] static void Main() { DirectoryInfo exePath = new DirectoryInfo(System.Windows.Forms.Application.StartupPath); CurDir = exePath.FullName + "\\"; ParaDir = exePath.Parent.FullName + "\\INI\\"; bool createNew; using (Mutex mutex = new Mutex(true, Application.ProductName, out createNew)) { if (createNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); } // 程序已经运行的情况,则弹出消息提示并终止此次运行 else { MessageBox.Show("MachineProEx程序已经在运行中..."); System.Threading.Thread.Sleep(1000); // 终止此进程并为基础操作系统提供指定的退出代码。 System.Environment.Exit(1); } } } }
  • 打赏
  • 举报
回复
引用 4 楼 华芸智森 的回复:
为什么不用反射来做 ? 一定要RUN的话,是要开一个线程,在线程里 RUN 。完毕来再关闭线程。
什么用反射来做?我不太明白这样做的目地
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
1.frmMain里干了啥 2.programe.cs 里你又干了啥
public frmMain() { InitializeComponent(); this.MinimizeBox = false; btnHide.Text = ""; }
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
额,楼上回复错了,你忽略回复
static void Main() { DirectoryInfo exePath = new DirectoryInfo(System.Windows.Forms.Application.StartupPath); bool createNew; // createdNew: // 在此方法返回时,如果创建了局部互斥体(即,如果 name 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true; // 如果指定的命名系统互斥体已存在,则为false using (Mutex mutex = new Mutex(true, Application.ProductName, out createNew)) { if (createNew) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new frmMain()); } // 程序已经运行的情况,则弹出消息提示并终止此次运行 else { MessageBox.Show("MachineProEx程序已经在运行中..."); System.Threading.Thread.Sleep(1000); // 终止此进程并为基础操作系统提供指定的退出代码。 System.Environment.Exit(1); } } } }
华芸智森 2020-06-28
  • 打赏
  • 举报
回复
为什么不用反射来做 ? 一定要RUN的话,是要开一个线程,在线程里 RUN 。完毕来再关闭线程。
wanghui0380 2020-06-28
  • 打赏
  • 举报
回复
额,楼上回复错了,你忽略回复
wanghui0380 2020-06-28
  • 打赏
  • 举报
回复
1.frmMain里干了啥 2.programe.cs 里你又干了啥

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧