C # Остановка передачи файлов TCP - PullRequest
1 голос
/ 24 января 2010

Я программирую простую передачу файлов TCP с использованием TcpListener на стороне получателя и TcpClient на стороне отправителя. У меня есть 2 варианта - синхронный или асинхронный. Если я использую синхронный режим, я должен поместить методы отправки / получения в BackgroundWorker, чтобы предотвратить зависание потока GUI. Асинхронная версия без проблем ...

У меня вопрос, как остановить передачу файлов?

В синхронной версии я пытался использовать метод BackgroundWorker.CancelAsync (), и в каждой итерации цикла проверяйте свойство BackgroundWorker.CancellationPending, но, похоже, оно не работает (CancelAsync, вероятно, не устанавливает свойство CancellationPending) :(

В асинхронной версии я пытался использовать изменчивую переменную Indicator и в каждом Callback проверять ее значение. Проблема в том, что когда я изменяю его значение в методе Stop (), а затем проверяю его в Callback, обратный вызов все равно считывает его предыдущее значение :(

Ответы [ 2 ]

1 голос
/ 25 января 2010

CancelASync должен работать; Вы установили:

backgroundWorker.WorkerSupportsCancellation = true:
0 голосов
/ 25 января 2010

Вы говорите, что не читаете правильное «состояние отмены», когда проверяете его? Это говорит о том, что вы неправильно синхронизируете флаг между вашими потоками.

Или вы просто не будете проверять состояние отмены, пока не получите новые данные? (Исходя из того, как вы описываете свои «циклы» tx / rx, в случаях как синхронизации, так и асинхронности вам придется получить новую дейтаграмму, прежде чем вы сможете проверить флаг «отмены»)

Если вы контролируете оба конца передачи данных, то любой конец (клиент или сервер), который хочет прервать, в идеале должен отправить специальную дейтаграмму на другой конец, чтобы остановить передачу - в противном случае другой конец попытается продолжить отправка / получение, не зная, что это само по себе. Поэтому, возможно, лучшим подходом было бы на самом деле отправить / получить дейтаграмму «отменить передачу», которая сообщала бы код TCP на обоих концах, которые вы хотите отменить. (т. е. вам не нужно иметь специальный флаг отмены, вы просто проверите, является ли дейтаграмма, которую вы собираетесь отправить или только что получили, дейтаграммой «отмена передачи»). Это позволит аккуратно и аккуратно закрыть оба конца.

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