【问题标题】:Cross Thread call inside Console Application (close the console from another thread)控制台应用程序内的跨线程调用(从另一个线程关闭控制台)
【发布时间】:2013-12-11 16:42:01
【问题描述】:

我在线程中有一个 notifyIcon,该图标有一个带有“关闭”选项的 contextMenu,但我无法从那里关闭控制台...

使用此代码只会关闭 notifyIcon,而不是控制台:

    public void mnuExit_Click(object sender, EventArgs e)
    {
        notificationIcon.Dispose();
        notifyThread.Abort();
        timerThread.Abort();
        Application.Exit();
    }

我试过了,但是控制台里面没有“Invoke”。

        this.Invoke((Action)delegate 
        {
            Application.Exit();
        });

编辑

我正在使用一个线程在 systemTray 中创建一个 notifyIcon,因为这是唯一的方法,没有别的办法。 notifyIcon 有一个名为“Exit”的选项。 Exit事件方法只关闭notifyIcon,但我也想关闭Console窗口。

即使我只是让Application.Exit();mnuExit_Click 中,也只有 notifyIcon 会关闭。

我的 program.cs 有这行代码来保持控制台打开:

System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

也许这就是问题所在……不确定。 (但我需要这个)

【问题讨论】:

  • 您是否在应用内创建任何表单?
  • 如何打开控制台/表单? (Application.Exit 会按照它说的做,所以当应用程序退出时,应用程序的系统托盘图标自然会消失。你真正想要的是只关闭表单/控制台,而不是整个应用程序 - 所以你应该保留一些对象引用您的控制台/表单能够在不退出您的应用程序的情况下关闭它。)
  • Application.Exit() 只能做一些事情来让线程退出,它不会关闭控制台窗口。 Environment.Exit() 是更大的锤子。
  • 它只是一个带有 notifyIcon 和 contextMenu 的控制台窗口。上下文菜单项“退出”应该关闭所有内容。
  • @HansPassant 我尝试使用Environment.Exit(0);,但同样的情况发生了,只是图标消失了,但控制台仍然打开。

标签: c# multithreading .net-4.0 console-application


【解决方案1】:

您为什么不尝试定义自己的事件。您可以在主线程中订阅它,当它被触发时,您可以在事件处理程序中关闭应用程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多