Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个线程会泄漏内存? 公共类工作者 { 私有布尔运行=false; 公共布尔功=真; 私有进程[]进程; 公共事件处理程序WorkerEvent; WorkerEvent上的公共虚拟无效(字符串\u事件) { 如果(WorkerEvent!=null)WorkerEvent(这是新的WorkerEventArgs(_事件)); } 公开作废开始() { 当(工作) { processs=Process.GetProcessesByName(“iw4mp.dat”); if(processs.Count()>=1) { 如果(!正在运行) { OnWorkerEvent(“运行”); } 运行=真; 睡眠(2500); } 其他的 { 如果(正在运行) { 工作事件(“退出”); } 运行=错误; 睡眠(2500); } foreach(流程中的var A) { A.处置(); } } } }_C#_Multithreading_Memory Leaks - Fatal编程技术网

C# 为什么这个线程会泄漏内存? 公共类工作者 { 私有布尔运行=false; 公共布尔功=真; 私有进程[]进程; 公共事件处理程序WorkerEvent; WorkerEvent上的公共虚拟无效(字符串\u事件) { 如果(WorkerEvent!=null)WorkerEvent(这是新的WorkerEventArgs(_事件)); } 公开作废开始() { 当(工作) { processs=Process.GetProcessesByName(“iw4mp.dat”); if(processs.Count()>=1) { 如果(!正在运行) { OnWorkerEvent(“运行”); } 运行=真; 睡眠(2500); } 其他的 { 如果(正在运行) { 工作事件(“退出”); } 运行=错误; 睡眠(2500); } foreach(流程中的var A) { A.处置(); } } } }

C# 为什么这个线程会泄漏内存? 公共类工作者 { 私有布尔运行=false; 公共布尔功=真; 私有进程[]进程; 公共事件处理程序WorkerEvent; WorkerEvent上的公共虚拟无效(字符串\u事件) { 如果(WorkerEvent!=null)WorkerEvent(这是新的WorkerEventArgs(_事件)); } 公开作废开始() { 当(工作) { processs=Process.GetProcessesByName(“iw4mp.dat”); if(processs.Count()>=1) { 如果(!正在运行) { OnWorkerEvent(“运行”); } 运行=真; 睡眠(2500); } 其他的 { 如果(正在运行) { 工作事件(“退出”); } 运行=错误; 睡眠(2500); } foreach(流程中的var A) { A.处置(); } } } },c#,multithreading,memory-leaks,C#,Multithreading,Memory Leaks,当我使用Start()函数调用ThreadStart时,这个类每2.5秒就会泄漏一次内存(是的,我使用任务管理器监视内存使用情况)。你知道为什么会这样吗 基本上,Start()方法应该只轮询iw4mp.dat是否正在运行,即使它可以工作。。。我不知道为什么它一直在为每个循环分配内存…在C#内存不会立即释放,即使调用了Dispose。垃圾收集器会在稍后的时间点释放它。垃圾收集器定期在后台自动运行。如果您看到它在很长一段时间(10分钟)内继续使用越来越多的内存,您可能会开始担心资源泄漏。这可能是因为

当我使用Start()函数调用ThreadStart时,这个类每2.5秒就会泄漏一次内存(是的,我使用任务管理器监视内存使用情况)。你知道为什么会这样吗


基本上,Start()方法应该只轮询iw4mp.dat是否正在运行,即使它可以工作。。。我不知道为什么它一直在为每个循环分配内存…

在C#内存不会立即释放,即使调用了
Dispose
。垃圾收集器会在稍后的时间点释放它。垃圾收集器定期在后台自动运行。如果您看到它在很长一段时间(10分钟)内继续使用越来越多的内存,您可能会开始担心资源泄漏。

这可能是因为您保留了整个阵列。您在循环结束时处理数组中的每个
进程
对象,但数组本身及其所有已处理(但不是垃圾收集)元素仍保留在内存中。垃圾收集器可以在任意时间启动,因此如果您的系统没有内存不足,那么可能只是因为GC尚未决定收集

如果您真的想强制收集,请将以下内容放在循环的末尾:

public class Worker
{
    private Boolean Running = false;
    public Boolean Work = true;
    private Process[] Processes;

    public event EventHandler<WorkerEventArgs> WorkerEvent;

    public virtual void OnWorkerEvent(String _Event)
    {
        if (WorkerEvent != null) WorkerEvent(this, new WorkerEventArgs(_Event));
    }

    public void Start()
    {
        while (Work)
        {
            Processes = Process.GetProcessesByName("iw4mp.dat");
            if (Processes.Count() >= 1)
            {
                if (!Running)
                {
                    OnWorkerEvent("Run");
                }
                Running = true;
                Thread.Sleep(2500);
            }
            else
            {
                if (Running)
                {
                    OnWorkerEvent("Exit");
                }
                Running = false;
                Thread.Sleep(2500);
            }
            foreach (var A in Processes)
            {
                A.Dispose();
            }
        }
    }
}

.Net应用程序可以“自由”声明所需的内存,并仅在需要时释放“泄漏”通常被称为无法释放的已分配内存。释放的对象可以在以后需要时释放。

newworkereventargs(\u事件)
:在哪里释放它

Processes = null;
GC.Collect();
WorkerEvent上的公共虚拟无效(字符串\u事件) { 如果(WorkerEvent!=null)WorkerEvent(这是新的WorkerEventArgs(_事件));
}任务管理器不是确定内存泄漏的正确工具。探查器将是一个更好的工具。首先,您应该使用一个临时变量,比如var handler=WorkerEvent,然后检查处理程序是否为null。作为补充说明,您不需要将
Work
Running
字段标记为
volatile
,因为它们显然会被
while(Work)
循环之外的线程修改吗? public virtual void OnWorkerEvent(String _Event) { if (WorkerEvent != null) WorkerEvent(this, new WorkerEventArgs(_Event) ); }