1

有什么方法可以在 .net4 中检查 CancellationToken 同时接受客户端同步。

    while (!token.IsCancellationRequested)
    {
        //change this somehow to use check cancellation but keep this blocking
        TcpClient client = _tcpListener.AcceptTcpClient();
        var client= new myclient(client);
        _clients.Add(telemetryClient);
    }

到目前为止我能做的最好的还不够干净:

        while (!token.IsCancellationRequested)
        {
            var acceptTask = Task<TcpClient>.Factory.FromAsync(_tcpListener.BeginAcceptTcpClient, _tcpListener.EndAcceptTcpClient, null);
            var tokenTask = Task.Factory.StartNew(() =>
                {
                    while (!token.IsCancellationRequested)
                    {
                        Thread.Sleep(1000);
                    }
                    return;
                }, token);
            Task.WaitAny(new Task[] { acceptTask ,tokenTask}, token);

            if (token.IsCancellationRequested)
                break;

            TcpClient client = acceptTask.Result;//_tcpListener.AcceptTcpClient();
            var client = new myclient(client);
            _clients.Add(telemetryClient);
        }
4

1 回答 1

0

仅执行 Task.WaitAny(acceptTask, token) 还不够吗?

即我不明白为什么需要tokenTask。

此外,如果发生取消,然后 acceptTask 遇到异常,您可能会发现出现“未观察到的异常”情况。考虑使用 TaskScheduler.UnobservedTaskException 来捕获(并可能忽略)这些。

-麦克风

于 2013-06-20T21:05:55.883 回答