当前位置:  开发笔记 > 编程语言 > 正文

如何让.NET控制台应用程序运行?

如何解决《如何让.NET控制台应用程序运行?》经验,为你挑选了4个好方法。

考虑一个Console应用程序,它在一个单独的线程中启动一些服务.它需要做的就是等待用户按Ctrl + C将其关闭.

以下哪项是更好的方法?

static ManualResetEvent _quitEvent = new ManualResetEvent(false);

static void Main() {
    Console.CancelKeyPress += (sender, eArgs) => {
        _quitEvent.Set();
        eArgs.Cancel = true;
    };

    // kick off asynchronous stuff 

    _quitEvent.WaitOne();

    // cleanup/shutdown and quit
}

或者,使用Thread.Sleep(1):

static bool _quitFlag = false;

static void Main() {
    Console.CancelKeyPress += delegate {
        _quitFlag = true;
    };

    // kick off asynchronous stuff 

    while (!_quitFlag) {
        Thread.Sleep(1);
    }

    // cleanup/shutdown and quit
}

Mike.. 60

您始终希望阻止使用while循环,尤其是在强制代码重新检查变量时.它浪费CPU资源并降低程序速度.

我肯定会说第一个.



1> Mike..:

您始终希望阻止使用while循环,尤其是在强制代码重新检查变量时.它浪费CPU资源并降低程序速度.

我肯定会说第一个.


+1.另外,由于`bool`没有声明为`volatile`,因此有可能在`while`循环中对`_quitFlag`的后续读取被优化掉,导致无限循环.

2> Cocowalla..:

或者,更简单的解决方案就是:

Console.ReadLine();


@fabriciorissetto OP问题陈述"启动异步内容",因此应用程序将在另一个线程上执行工作

3> Thomas Leves..:

你可以这样做(并删除CancelKeyPress事件处理程序):

while(!_quitFlag)
{
    var keyInfo = Console.ReadKey();
    _quitFlag = keyInfo.Key == ConsoleKey.C
             && keyInfo.Modifiers == ConsoleModifiers.Control;
}

不确定这是否更好,但我不喜欢调用Thread.Sleep循环的想法..我认为阻止用户输入更清晰.



4> ygaradon..:

我更喜欢使用Application.Run

static void Main(string[] args) {

   //Do your stuff here

   System.Windows.Forms.Application.Run();

   //Cleanup/Before Quit
}

来自文档:

开始在当前线程上运行标准应用程序消息循环,没有表单.


但是你为此只依赖于Windows窗体.传统的.NET框架并没有太多问题,但目前的趋势是模块化部署,仅包括您需要的部分.
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有