C# CancellationTokenSource-关闭错误的任务

C# CancellationTokenSource-关闭错误的任务,c#,task,cancellationtokensource,cancellation-token,C#,Task,Cancellationtokensource,Cancellation Token,请告诉我出了什么错? 执行Look 1后,将抛出异常Look 2,而不是Look 3的结尾。 这是我的密码 private CancellationTokenSource Start() { var cts = new CancellationTokenSource(); Log.Info("INFO:", "Thread Start() begin !!!"); Task.Run(async () => {

请告诉我出了什么错? 执行
Look 1
后,将抛出异常
Look 2
,而不是
Look 3
的结尾。 这是我的密码

private CancellationTokenSource Start()
    {
        var cts = new CancellationTokenSource();
        Log.Info("INFO:", "Thread Start() begin !!!");
        Task.Run(async () => {
            try
            {
                await Send("Test");
                var res = await Read(WAIT_ANSWER_TO);
            }
            catch (OperationCanceledException)
            {
                Log.Info("INFO:", "Thread Start() canceled !!!");//Look 2
            }
        }, cts.Token);
        return cts;//for external closure
    }
public async Task<string> Read(int milisecond)
    {
        string line = "";
        var c = new CancellationTokenSource();
        Action<string> fun = (s) =>
        {
            line = s;
            c.Cancel();//Look 1
        };
        NewLine += fun;
        await Task.Delay(milisecond, c.Token);//Look 3
        NewLine -= fun;
        return line;
    }
private void Reader()
    {
        Log.Info("INFO:", "Thread Reader() begin !!!");
        Task.Run(async () => {
            try
            {
                var bufReader = new BufferedReader(new InputStreamReader(Socket.InputStream));
                while (true)
                {
                    var res = await bufReader.ReadLineAsync();
                    if (NewLine != null) NewLine(res);
                }
            }
            catch(Java.IO.IOException)
            {
                Log.Info("INFO:", "Thread Reader() canceled !!!");//because socked closed
            }
        });
    }
private CancellationTokenSource Start()
{
var cts=新的CancellationTokenSource();
Info(“Info:,”线程开始()开始!!!”;
Task.Run(异步()=>{
尝试
{
等待发送(“测试”);
var res=等待读取(等待回答);
}
捕获(操作取消异常)
{
Log.Info(“信息:”,“线程开始()已取消!!!”;//查看2
}
},cts.Token);
返回cts;//用于外部闭包
}
公共异步任务读取(整数毫秒)
{
字符串行=”;
var c=新的CancellationTokenSource();
动作乐趣=(s)=>
{
直线=s;
c、 Cancel();//查看1
};
新线+=有趣;
等待任务。延迟(毫秒,c.Token);//看3
新线-=有趣;
回流线;
}
专用void读取器()
{
Info(“Info:,”线程读取器()begin!!!”;
Task.Run(异步()=>{
尝试
{
var bufReader=new BufferedReader(new InputStreamReader(Socket.InputStream));
while(true)
{
var res=wait bufReader.ReadLineAsync();
如果(换行符!=null)换行符(res);
}
}
catch(Java.IO.IOException)
{
Log.Info(“信息:,“线程读取器()已取消!!!”;//因为套接字已关闭
}
});
}

这个代码太复杂了。太多的CTS和任务不是线程。在任何情况下,
wait Task.Delay(毫秒,c.Token)抛出由
捕获(OperationCanceledException)
捕获的异常。只涉及一个例外。
NewLine
不管它是什么,都不需要。如果您想在换行符到达时取消,只需从
Reader
返回即可。读取器应该依次是
异步任务
,而不是
任务。运行
ReadLineSync
已经是异步的,
任务。运行
只会浪费一个任务,甚至不使用线程,除了创建缓冲区和调用
换行符
好的,谢谢,我明白了!