简化我的项目,我有以下方法:
void Foo() {
CancellationTokenSource CancellationTS = new CancellationTokenSource();
CancellationToken CancellationT = CancellationTS.Token;
Thread thread = new(() => {
Thread.Sleep(TimeSpan.FromSeconds(10));
CancellationTS.Cancel();
});
thread.Start();
Task Task = new Task(() => {
try {
Task.Delay(TimeSpan.FromMinutes(15), CancellationT).Wait();
} catch { }
});
Task.Start();
Task.Wait();
if (CancellationT.IsCancellationRequested) {
[...]
} else {
[...]
}
}
实际上CancellationTS.cancel自然不是在这样指示的任务中,而是由远程事件触发,但这不是重点。
我想避免在任务中使用 try catch 结构。
通过手动重置事件可以更简单地重现发布的行为
public void Foo(){
using var mre = new ManualResetEventSlim();
Task.Run(()=> {Thread.Sleep(TimeSpan.FromSeconds(10)); mre.Set();});
bool wasSet = mre.Wait(TimeSpan.FromMinutes(15));
}
这将阻塞线程,直到设置事件或发生 15 分钟超时。返回的布尔值可用于确定事件是否已设置或是否发生超时。