Почему вызов «Закрыть» для потока ведет себя по-разному в C # и в Java? - PullRequest
4 голосов
/ 29 июня 2011

Рассмотрим следующий сценарий: сервлет был написан на Java, и когда вы подключаетесь к сервлету, он начинает запись в OutputStream, скажем, 10 миллионов байтов, по 1 байту за раз.

У вас есть клиентская программа, которая читает поток ответа сервлета и читает, скажем, 100 байтов и закрывает вызовы. Теперь, если ваша клиентская программа находится на Java, потоки закрываются немедленно и сервер прекращает отправку контента, но если клиентская программа находится на C #, вызов close занимает много времени, потому что он, очевидно, ожидает, пока сервер завершит запись всех 10 миллионов байт.

Итак, у меня есть два вопроса по этому вопросу,

  1. Почему C # ведет себя по-другому?
  2. Что я могу сделать, чтобы гарантировать, что вызов Close в потоке C # немедленно закрывает поток и не позволяет серверу продолжать отправку данных?

Любые указатели будут с благодарностью: -)

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Я предполагаю, что здесь есть какие-то розетки. Я подозреваю, что реализация Java просто закрывает клиентский сокет, возможно, вызывая ошибку на сервере, в то время как версия C # немного более дружественна к серверу и ожидает, пока он подтвердит закрытый запрос. Поскольку сервер занят отправкой данных, он не получает (или, по крайней мере, не обрабатывает) запрос на закрытие, пока не завершит отправку.

Подумайте об этом так: кто-то за вашей дверью пытается вам что-то продать, и вас не прервут. Вы можете хлопнуть дверью по их лицу, которое немедленно закрывает их, или можете подождать, пока они закончат разговор, и затем попросить их уйти.

Чтобы решить эту проблему, возможно, вы могли бы создать рабочий поток, который открывает поток, ждет 100 байт, а затем закрывается. В то же время ваша программа может делать все, что ей нужно, в то время как поток в конечном итоге закрывается.

0 голосов
/ 02 августа 2011

Итак, я наконец выяснил это пару недель назад и проверил это и в Microsoft.Разница между C # и Java заключается в том, что в Java вызов close также закрывает запрос / соединение, тогда как в C # этого не происходит, если вы не выполните его с помощью вызова xxxRequest.Abort ().Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...