频繁创建线程时内存泄漏

Memory leak when thread create frequently

提问人:czxinc 提问时间:1/15/2023 最后编辑:czxinc 更新时间:1/16/2023 访问量:76

问:

我想在触发事件时生成图像。当事件再次触发并且图像仍在生成时。它将中止生成并再次生成。 但是我的代码会导致内存泄漏。应用程序的内存使用量将迅速增长。有谁知道怎么了?

编辑:我在线程中止后放置。但这没用。GC.Collect()

编辑:当计时器的间隔设置为一个大数字(如 2000 年)时,泄漏速度会变慢。

这是我的代码:

Public Class Form1
    Dim a As Threading.Thread
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Main()
    End Sub

    Sub Main()
        If a IsNot Nothing AndAlso a.IsAlive Then
            a.Abort()
            a.Join()
            'GC.Collect()   'not working
            'GC.WaitForPendingFinalizers()   'not working
        End If
        a = New Threading.Thread(AddressOf func)
        a.Start()
    End Sub

    Sub func()
        Dim newObj As Class1 = Nothing
        Try
            newObj = New Class1
        Catch ex As Threading.ThreadAbortException
            newObj?.Dispose()
        End Try
    End Sub
End Class

Public Class Class1
    Implements IDisposable
    Dim Img As New Bitmap(4095, 4095)

    Public Sub Dispose() Implements IDisposable.Dispose
        Img?.Dispose()
    End Sub
End Class
.NET vb.net 多线程处理

评论

4赞 Hans Passant 1/15/2023
使用 VS 中内置的内存分析器,以便查看泄露的对象。顺便说一句,通常是位图,小型托管对象不会对 GC 施加任何压力,但会占用大量非托管内存。
0赞 czxinc 1/15/2023
我试过了。但是我找不到有关位图的任何泄漏信息。
0赞 GSerg 1/15/2023
您是否在发布版本中看到相同的结果?
0赞 czxinc 1/16/2023
@GSerg我尝试切换到本文的发布版本。它不起作用。GC.WaitForPendingFinalizers()
0赞 Idle_Mind 1/16/2023
这显然不是您的完整代码。是否可以将位图重置为“擦除”状态并重新启动绘制它的循环机制,而不是创建一个全新的线程和新的位图?无论如何,这几乎都不是正确的方法,因为它已经被弃用和过时了很长时间。Thread.Abort()

答: 暂无答案