0

我制作了一个连接到 IRC 服务器的小类,现在我正在尝试处理套接字。

每当我这样做时,我都会得到一个

由于线程退出或应用程序请求,I/O 操作已中止

可能值得注意的是,我正在调用 dispose 函数

protected override void OnNavigatedFrom(NavigationEventArgs e)

在处理 StreamSocket 之前,我也尝试过从 DataReader 中分离流,但它仍然无法正常工作。事实上,它引发了另一个错误。

操作标识符无效

我还应该如何处理 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();
}
4

1 回答 1

0

您需要先取消对套接字的读取操作。他的堡垒,使用CancellationToken.

创建一个全局CancellationTokenSource

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

调用DataReader.LoadAsync()传递令牌时:

uint s = await _dataReader.LoadAsync(1024).AsTask(
    cancellationTokenSource.Token);

最后,当你想放弃一切时,调用取消:

cancellationTokenSource.Cancel();

但是,在这种情况下,LoadAsync()调用将以 结束TaskCanceledException

您不再需要处理套接字,套接字将作为取消读取操作的一部分而关闭。

于 2014-11-26T22:00:37.973 回答