我正在使用接收方的TcpListener和发送方的TcpClient编写简单的TCP文件传输。我有2个选项 - 同步或异步。如果我使用synchronnous,我必须将发送/接收方法放入BackgroundWorker,以防止冻结GUI线程。 Asynchronnous版本没有问题...
我的问题是,如何停止运行文件传输?
在同步版本中我尝试使用BackgroundWorker.CancelAsync()方法,并在每次循环迭代中检查BackgroundWorker.CancellationPending属性,但它似乎不起作用(CancelAsync可能没有设置CancellationPending属性):(
在异步版本中,我尝试使用volatile变量Indicator,并在每个Callback中检查其值。问题是,当我在Stop()方法中更改其值,而不是在Callback中检查它时,回调仍会读取其先前的值:(
答案 0 :(得分:1)
CancelASync应该有效;你有没有设置:
backgroundWorker.WorkerSupportsCancellation = true:
答案 1 :(得分:0)
您是说在检查时没有阅读正确的“取消状态”吗?这表明你没有正确地同步你的线程之间的标志。
或者只是除非您收到一些新数据,否则您不会检查“取消状态”? (从您描述tx / rx“循环”的方式来看,在同步和异步情况下,您将不得不接收新的数据报,然后才有机会检查“取消”标志)
如果您控制数据传输的两端,那么无论哪一端(客户端或服务器)希望中止,理想情况下都应该向另一端发送特殊数据报以停止传输 - 否则另一端将尝试继续发送/接收,不知道它是独立的。因此,或许更好的方法是实际发送/接收“取消传输”数据报,这将通知您希望取消的两端的TCP代码。 (即您不需要特殊的取消标志,您只需检查您要发送或刚收到的数据报是否为“取消转移”数据报)。这样可以让两端优雅而干净地关闭。