运行 一个不消耗内存的连续 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);
}
}
等待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);
}
}
我写了一个简短的 C# 脚本来在我的计算机启动时执行。它的功能是监控 iTunes 并显示一条有趣的消息作为我的 Skype 状态,说明我正在听的艺术家。
它创建一个 iTunesApp 对象并添加一个侦听器来检测曲目何时更改。问题是我需要使用 while(true)
循环来让我的应用程序在后台保持打开状态,否则它只会 运行 并关闭。在我查看任务管理器并意识到这个小程序使用了 CPU!
有没有更好的方法?
这里是代码的核心,想了解一下:
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);
}
}
等待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);
}
}