运行 一个不消耗内存的连续 Windows 后台任务

Run a Continuous Windows Background Task without Eating Memory

我写了一个简短的 C# 脚本来在我的计算机启动时执行。它的功能是监控 iTunes 并显示一条有趣的消息作为我的 Skype 状态,说明我正在听的艺术家。

它创建一个 iTunesApp 对象并添加一个侦听器来检测曲目何时更改。问题是我需要使用 while(true) 循环来让我的应用程序在后台保持打开状态,否则它只会 运行 并关闭。在我查看任务管理器并意识到这个小程序使用了 CPU!

的 15%-20% 之前,我认为这没问题

有没有更好的方法?

这里是代码的核心,想了解一下:

static void Main(string[] args)
{
    iTunesApp = new iTunesAppClass();
    iTunesApp.OnPlayerPlayEvent += ITunesApp_OnPlayerPlayEvent;
    while (true)
    { }
}

private static void ITunesApp_OnPlayerPlayEvent(object iTrack)
{
    var currentArtist = iTunesApp.CurrentTrack.Artist;
    if (currentArtist != LastArtist)
    {
        LastArtist = currentArtist;
        var message = GetMessage(currentArtist);
        UpdateSkypeStatus(message);
        UpdateLog(message);
    }
}

完整项目位于 https://github.com/ericsundquist/SkypeTunes

等待ManualResetEvent,并在您的程序需要关闭时设置()它。在我下面的例子中,调用 Stop 来结束你的程序。

static ManualResetEvent signal;
static void Main(string[] args)
{
    iTunesApp = new iTunesAppClass();
    iTunesApp.OnPlayerPlayEvent += ITunesApp_OnPlayerPlayEvent;

    signal = new ManualResetEvent(false);
    signal .WaitOne();
}

public static void Stop()
{
    signal.Set();
}

private static void ITunesApp_OnPlayerPlayEvent(object iTrack)
{

    var currentArtist = iTunesApp.CurrentTrack.Artist;
    if (currentArtist != LastArtist)
    {
        LastArtist = currentArtist;
        var message = GetMessage(currentArtist);
        UpdateSkypeStatus(message);
        UpdateLog(message);
    }
}