【发布时间】:2018-06-02 14:37:04
【问题描述】:
以下应用在系统托盘图标中显示磁盘活动。它正常运行大约 30-40 分钟,然后终止,将图标留在桌面上。就好像它被系统作为不必要的后台任务杀死一样。为什么会发生这种情况,我该如何预防?
public partial class MainWindow : Window
{
public System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
public MainWindow()
{
InitializeComponent();
ni.Visible = true;
ni.Text = "disktray"; // tooltip text show over tray icon
CreateTextIcon("0");
ni.DoubleClick +=
delegate (object sender, EventArgs args)
{
//this.Show();
//this.WindowState = WindowState.Normal;
ni.Visible = false;
ni.Dispose();
System.Windows.Application.Current.Shutdown();
};
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
CreateTextIcon("0");
DispatcherTimer timer = new DispatcherTimer()
{
Interval = TimeSpan.FromMilliseconds(1024)
};
timer.Tick += Timer_Tick;
timer.Start();
this.Hide();
}
private void Timer_Tick(object sender, EventArgs e)
{
Diskpercent();
string iii = diskpercentvalue.ToString();
CreateTextIcon(iii);
}
public PerformanceCounter myCounter =
new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
public int diskpercentvalue = 0;
public void Diskpercent()
{
var d = Convert.ToInt32(myCounter.NextValue());
if (d > 99) d = 99; // can go over 100%
diskpercentvalue = d;
}
public System.Drawing.Font fontToUse =
new System.Drawing.Font("Microsoft Sans Serif", 16, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);
public System.Drawing.Brush brushToUse = new SolidBrush(System.Drawing.Color.White);
public Bitmap bitmapText = new Bitmap(16, 16);
public IntPtr hIcon;
public void CreateTextIcon(string str)
{
//System.Drawing.Font fontToUse = new System.Drawing.Font("Microsoft Sans Serif", 16, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);
//System.Drawing.Brush brushToUse = new SolidBrush(System.Drawing.Color.White);
//Bitmap bitmapText = new Bitmap(16, 16);
Graphics g = System.Drawing.Graphics.FromImage(bitmapText);
//IntPtr hIcon;
g.Clear(System.Drawing.Color.Transparent);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
g.DrawString(str, fontToUse, brushToUse, -4, -2);
hIcon = (bitmapText.GetHicon());
ni.Icon = System.Drawing.Icon.FromHandle(hIcon);
}
}
【问题讨论】:
-
Windows 中不存在系统杀死不必要的后台应用程序。
-
我猜你的应用程序正在泄漏句柄。打开任务管理器,在其中添加“handles”列,找到你的进程并检查数字是否随时间增长。
-
句柄在 630 到 780 之间变化。
-
Font、Brush、Bitmap和Graphics都实现了IDisposable并且您没有正确处理其中的任何一个。此外,您可能希望将Bitmap的实例保留更长时间,因为当前 GC 可以在GetHicon调用后立即将其杀死,您应该将其设为类成员。 -
Graphics仍然必须明确处理。如果没有处理,检查还有什么增长。内存?