【问题标题】:C# console program wait forever for eventC# 控制台程序永远等待事件
【发布时间】:2015-07-09 16:59:11
【问题描述】:

我有一个附加到事件的简单 C# 控制台应用程序。我需要程序继续运行,以便它可以响应事件。保持它运行的正确方法是什么?

这是我的申请:

using System;
using NAudio.CoreAudioApi;

namespace MaxVolume
{
    class Program
    {
        private const float DesiredLevel = -15;
        private static MMDevice _device;

        static void Main(string[] args)
        {
            MMDeviceEnumerator mmde = new MMDeviceEnumerator();
            _device = mmde.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);

            _device.AudioEndpointVolume.MasterVolumeLevel = DesiredLevel;

            _device.AudioEndpointVolume.OnVolumeNotification += SetVolume;
        }

        static void SetVolume(AudioVolumeNotificationData data)
        {
            if (Math.Abs(data.MasterVolume - DesiredLevel) > 0.1)
            {
                _device.AudioEndpointVolume.MasterVolumeLevel = DesiredLevel;
            }
        }
    }
}

【问题讨论】:

  • 也许你应该考虑创建一个 Windows 服务
  • @RobinNadeau 最终我会,但现在我需要它成为一个控制台应用程序,以便非管理员用户可以使用它进行测试。

标签: c#


【解决方案1】:

您可以致电Console.ReadLine()(如果您想在击键时终止),或者直接致电Thread.Sleep(Timeout.Infinite)

【讨论】:

  • 叮,我们赢了!
【解决方案2】:

如果是async main 方法,也可以使用await Task.Delay(-1);

【讨论】:

    【解决方案3】:

    你可以像这样创建一个while循环:

    while(!eventFired) {}
    

    然后有一个字段:

    private bool eventFired = false;
    

    最后当事件触发时 make:

    eventFired = true;
    

    (如果您希望它在事件触发一次后退出,也就是说。如果它应该永远运行,请使用 sleep 和 readkey 查看其他答案)

    注意:这会占用 CPU,不应该在任何生产环境中使用,但在快速而肮脏的测试环境中,这可能是值得的。

    【讨论】:

    • 这不是线程安全的,并且会挂起一个 CPU 内核。不要那样做。
    • 编辑它以反映我对使用它的想法。
    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多