我已经创建了一个连接到IRC服务器的小类,现在我试图处理该套接字。
每当我这样做,我就得到了
I / O操作因线程退出或中断而中止 申请请求
我可能值得注意的是我正在调用dispose函数
protected override void OnNavigatedFrom(NavigationEventArgs e)
在处理StreamSocket之前,我还尝试从DataReader中分离Stream,但它仍然无法正常工作。实际上它引发了另一个错误。
操作标识符无效
我还应该如何处置StreamSocket?
这就是我想象的Dipose方法应该是这样的:
public async void Dispose()
{
_closing = true;
if (_connected)
SendRawMessage("QUIT :");
//_dataReader.DetachStream();
await _clientSocket.DisposeAsync();
_dataReader.Dispose();
_connected = false;
_closing = false;
}
当我连接时,我这样做:
await _clientSocket.ConnectAsync(hostname, Port.ToString());
_connected = true;
_dataReader = new DataReader(_clientSocket.InputStream) { InputStreamOptions = InputStreamOptions.Partial };
ReadData();
读取数据方法是递归的,并继续读取任何传入数据:
async private void ReadData() {
if (!_connected || _clientSocket == null || _closing == true) return;
uint s = await _dataReader.LoadAsync(1024);
string data = _dataReader.ReadString(s);
ReadData();
}
答案 0 :(得分:0)
您需要先取消套接字上的读取操作。堡垒他,使用CancellationToken
。
创建全局CancellationTokenSource
:
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
调用DataReader.LoadAsync()
时传递令牌:
uint s = await _dataReader.LoadAsync(1024).AsTask(
cancellationTokenSource.Token);
最后,当你想放弃一切时,请致电取消:
cancellationTokenSource.Cancel();
但是,在这种情况下,LoadAsync()
来电将以TaskCanceledException
结束。
您不再需要丢弃插座,插座将在取消读取操作时关闭。