C# 为什么在Threading.Timer中使用Icon.FromHandle设置NotifyIcon.Icon会导致内存泄漏?

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

我将导致内存泄漏的代码行限制为以下从原始windows应用程序获得的无用代码

我已经知道,当回调(或勾号事件)中的变量未正确处理时,计时器会导致内存泄漏,这就是为什么我在函数中放置了两个“使用”部分。但我还是看不出我在管什么

我曾考虑过定时轰炸,但即使我将间隔设置为1000毫秒,内存仍然会增加,直到出现内存异常

大宗报价

大宗报价


我不认为这是答案,因为我没有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());
            }
        }
    }
}