Re[2]: Почему Thread не умирает?
От: Abuserrr  
Дата: 27.07.06 10:08
Оценка:
Здравствуйте, tyger, Вы писали:

T>Хм...

T>Если это настолько критично, может попробывать "бросить" этот повисшый поток и создать другой заново (предварительно конечно сделав все возможное для удаления повисшего)...
T>Возможно, итоге (по какому-то внутреннему таймауту) повысший поток и отвалится...
T>Но так можно поступить только если уже ничего больше не помогает... и последить первое время за расходом памяти и ресурсов....

В принципе временное решение такое и есть. Бросить подвисший поток, предварительно вызвав для него аборт (сделал с помощью промежуточного потока, модифицировав SendToServerClass)

public class SendToServerClass
{
    private MessageEventArgs m_argsToSend;
    private bool m_isSent;
    private bool m_WasError;
    private Exception m_Exception;
    private Thread m_SendInClass;

    public bool IsSent
    {
    get { return m_isSent; }
    }

    public bool isError
    {
        get { return m_WasError; }
    }

    public Exception Exception
    {
        get { return m_Exception; }
    }

    public SendToServerClass(MessageEventArgs p_argsToSend)
    {
        m_isSent=false;
        m_WasError=false;
        m_Exception=null;
           m_argsToSend=p_argsToSend;
    }
    public void SendToServerMethod()
    {
        try
        {
            m_SendInClass=new Thread(new ThreadStart(Send));
        m_SendInClass.Start();
        m_SendInClass.Join();
            m_isSent=true;
        }
        catch (Exception ex)
        {
            if (m_SendInClass!=null && m_SendInClass.IsAlive)
        {
        m_SendInClass.Abort();
        }
            m_Exception=ex;
            m_WasError=true;
            m_isSent=false;
        }
    }

    private void Send()
    {
    try
    {
        Server.Instance.SendToServer.SendMessageToServerSync(m_argsToSend);
    }
    catch (Exception ex)
    {
        m_Exception=ex;
        m_WasError=true;
        m_isSent=false;
    }
    }
}


Недостаток такой, что поток, который делает Server.Instance.SendToServer так и продолжает жить (хоть и в редких случаях, но все же). И в таком случае при закрытии приложения, оно продолжает висеть в процессах

И еще вопрос, когда я делаю m_SendInClass.Abort(); в SendToServerMethod что первое должно выполниться, кетч в методе Send или продолжиться выполнение кетча в SendToServerMethod? Или все это будет происходить паралельно и приведет к неоднозначности?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.