Thread.Abort () зависает в NetworkStream.Read? - PullRequest
0 голосов
/ 10 марта 2012

У меня есть приложение для передачи файлов (сервер-клиент) ... при отправке файла я хочу включить отмену.
Клиент Отмените метод SendFile, который работает в backgroundworker, затем он отправляет команду на сервер, чтобы отменить свой поток приема.
когда сервер получает эту команду, он вызывает метод Stop , но застревает в этой строке network.Read (data, 0, data.Length);

как я могу прервать эту тему и перейти к наконец без застревания в сети. Читать (..) ??
спасибо заранее.

Thread thTransferFile = null;

void Start()
{
    thTransferFile = new Thread(unused => ft.Receive(destPath, Convert.ToInt64(fileSize);
    thTransferFile.Start();
}

void Stop()
{
    thTransferFile.Abort();
}


public void Receive(string destPath, long fileSize)
    {
        using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
        {
            try
            {
                int count = 0;
                long sum = 0;
                data = new byte[packetSize];
                while (sum < fileSize)
                {
                    count = network.Read(data, 0, data.Length);   //thread stucks in this line when i abort it
                    fs.Write(data, 0, count);
                    sum += count;
                }
            }
            finally
            {
                network.Write(new byte[1], 0, 1); //tell client that the file transfer ends
                network.Flush();
                fs.Dispose();
                if (Thread.CurrentThread.ThreadState == ThreadState.AbortRequested)
                {
                    File.Delete(destPath);
                }
            }
      }

Ответы [ 3 ]

1 голос
/ 10 марта 2012

NetworkStream.Read блокируется, пока не получит данные. Установите время ожидания операции чтения с помощью NetworkStream's ReadTimeout Прочитайте комментарий сообщества . Кроме того, вы можете пересмотреть использование Abort (), чтобы убить ваш поток. Добавьте логический флаг в ваш цикл while и установите этот флаг в false, когда вызывается Stop (). Этот флаг остановки в сочетании с ReadTimeout обеспечит завершение вашей программы.

Поток, вызывающий Abort, может блокироваться, если поток Прерванный находится в защищенной области кода, такой как блок catch, наконец, блок или ограниченная область выполнения. Если нить то вызывает Abort содержит блокировку, которая требуется для прерванного потока, тупик может произойти.

1 голос
/ 10 марта 2012

Вместо прерывания потока, Close() network.Он выдаст исключение, как вы ожидаете.

Уничтожение потоков - это большое нет-нет, поскольку есть ресурсы, которые можно оставить не очищенными ...

0 голосов
/ 10 марта 2012

я нашел решение когда я отменяю отправку со стороны клиента .. network.DataAvailable устанавливается в false .. поэтому я добавил эту строку в свой метод приема на сервере

в цикле while:

                while (sum < fileSize)
                {
                    if (network.DataAvailable)
                    {
                        count = network.Read(data, 0, data.Length);
                        fs.Write(data, 0, count);
                        sum += count;
                    }
                }

так что он никогда не застрянет в сети. это полностью сработало

...