无需 try catch 的CancellationToken

问题描述 投票:0回答:1

简化我的项目,我有以下方法:

        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 结构。

c# task
1个回答
0
投票

通过手动重置事件可以更简单地重现发布的行为

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 分钟超时。返回的布尔值可用于确定事件是否已设置或是否发生超时。

© www.soinside.com 2019 - 2024. All rights reserved.