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
已经是异步的,任务。运行
只会浪费一个任务,甚至不使用线程,除了创建缓冲区和调用换行符
好的,谢谢,我明白了!