Утечка памяти при использовании потоков

Нет, нет, нет, нет, нет, нет, нет. Никогда threads не используйте Thread.Abort().

Прочтите threads об этом MSDN docs.


Не гарантируется, что поток будет прерван немедленно или вообще. Такая ситуация может возникнуть, если поток выполняет неограниченное количество вычислений в блоках finally, которые вызываются как часть процедуры прерывания, тем самым на неопределенное время задерживая прерывание. Чтобы дождаться прерывания потока, вы можете вызвать метод Join в потоке после вызова метода Abort, но нет гарантии, что ожидание закончится.


Правильный способ threading завершить поток - сообщить c# ему, что он должен завершиться, а csharp затем вызвать Join() в этом c#.net потоке. Обычно я делаю что-то dot-net вроде этого (псевдокод):

public class ThreadUsingClass
{
    private object mSyncObject = new object();
    private bool mKilledThread = false;
    private Thread mThread = null;

    void Start()
    {
        // start mThread
    }

    void Stop()
    {
        lock(mSyncObject)
        {
            mKilledThread = true;
        }

        mThread.Join();
    }

    void ThreadProc()
    {
        while(true)
        {
            bool isKilled = false;
            lock(mSyncObject)
            {
                isKilled = mKilledThread;
            }
            if (isKilled)
                return;
        }
    }    
}

c#

.net

multithreading

memory

timer

2022-05-05T22:58:00+00:00
Вопросы с похожей тематикой, как у вопроса:

Утечка памяти при использовании потоков