无法配置StreamSocket

时间:2014-11-23 15:31:48

标签: c# stream windows-runtime dispose stream-socket-client

我已经创建了一个连接到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();
}

1 个答案:

答案 0 :(得分:0)

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

创建全局CancellationTokenSource

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

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

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

最后,当你想放弃一切时,请致电取消:

cancellationTokenSource.Cancel();

但是,在这种情况下,LoadAsync()来电将以TaskCanceledException结束。

您不再需要丢弃插座,插座将在取消读取操作时关闭。