C# 为什么在Threading.Timer中使用Icon.FromHandle设置NotifyIcon.Icon会导致内存泄漏?
我将导致内存泄漏的代码行限制为以下从原始windows应用程序获得的无用代码 我已经知道,当回调(或勾号事件)中的变量未正确处理时,计时器会导致内存泄漏,这就是为什么我在函数中放置了两个“使用”部分。但我还是看不出我在管什么 我曾考虑过定时轰炸,但即使我将间隔设置为1000毫秒,内存仍然会增加,直到出现内存异常 大宗报价 大宗报价C# 为什么在Threading.Timer中使用Icon.FromHandle设置NotifyIcon.Icon会导致内存泄漏?,c#,memory,memory-leaks,timer,bitmap,C#,Memory,Memory Leaks,Timer,Bitmap,我将导致内存泄漏的代码行限制为以下从原始windows应用程序获得的无用代码 我已经知道,当回调(或勾号事件)中的变量未正确处理时,计时器会导致内存泄漏,这就是为什么我在函数中放置了两个“使用”部分。但我还是看不出我在管什么 我曾考虑过定时轰炸,但即使我将间隔设置为1000毫秒,内存仍然会增加,直到出现内存异常 大宗报价 大宗报价 我不认为这是答案,因为我没有GUI,这是一个没有GUI的windows应用程序,只有一个通知图标。我已经尝试过其他类型的计时器(也包括System.Widows.Fo
我不认为这是答案,因为我没有GUI,这是一个没有GUI的windows应用程序,只有一个通知图标。我已经尝试过其他类型的计时器(也包括System.Widows.Forms.timer),但到现在为止运气都不好。事实上我不知道,所以我提出了这个问题。我搜索了一下,似乎没有问题。因此,这是许多位图经常遇到的问题。关于那个问题有很多疑问。因此,问题与计时器无关,使用大循环时也会遇到同样的问题。你是对的,我在一个线程中尝试了相同的方法,但问题仍然存在,我将寻找更健康的方法来更新图标,忽略更新图标的线程。这是解决方案:。在临时变量中保存使用icon.FromHandle()创建的图标,并在循环结束时通过DestroyIcon(newIcon.Handle)将其删除,解决了此问题。是我的错,我一开始考虑了跨线程问题,只搜索了那个。
class Program
{
private static bool locked {get; set; }
static void Main(string[] args)
{
System.Threading.Timer timer_log = new System.Threading.Timer(t_callback, null, 0, 100);
Application.Run();
}
private static void t_callback(Object state)
{
if (locked == false)
{
locked = true;
Leak.SetIcon();
locked = false;
}
}
}
static class Leak
{
private static NotifyIcon notifyIcon = new NotifyIcon();
static public void SetIcon()
{
using (Bitmap bitmapIcona = new Bitmap(Properties.Resources.LoggerServiceImg))
{
using (Graphics graphicsIcona = Graphics.FromImage(bitmapIcona))
{
notifyIcon.Icon = Icon.FromHandle(bitmapIcona.GetHicon());
}
}
}
}