gpt4 book ai didi

c# - CancellationToken和CancellationTokenSource-如何使用?

转载 作者:太空狗 更新时间:2023-10-29 20:02:56 28 4
gpt4 key购买 nike

我有一个名为 Load 的 UI 按钮。它生成一个线程,该线程又生成一个任务。有一个等待任务,如果它过期任务被取消。 Load 按钮没有被禁用,用户可以多次点击它。每次点击前一个任务都应该被取消。

我对如何在此处使用 CancellationTokenSource 和 CancellationToken 感到困惑。下面是代码。能否请您建议如何使用它以及以下用法是否有任何问题?请不要异步,因为我们还没有。

CancellationTokenSource _source = new CancellationTokenSource();
public void OnLoad()
{
//Does this cancel the previously spawned task?
_source.Cancel();
_source.Dispose();
_source = new CancellationTokenSource();
var activeToken = _source.Token;
//Do I need to do the above all the time or is there an efficient way?

Task.Factory.StartNew(() =>
{
var child = Task.Factory.StartNew(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(20));
activeToken.ThrowIfCancellationRequested();
}, activeToken);

if (!child.Wait(TimeSpan.FromSeconds(5)))
{
_source.Cancel();
}
});
}

注意我需要取消任何之前生成的任务,并且每个生成的任务都应该有超时。

最佳答案

这样做就可以了:

    private CancellationTokenSource _cancelTasks;

// this starts your process
private void DoStuff()
{
_cancelTasks = new CancellationTokenSource();

var task = new Task(() => { /* your actions here */ }, _cancelTasks.Token);
task.Start();

if (!task.Wait(5000)) _cancelTasks.Cancel();
}

关于c# - CancellationToken和CancellationTokenSource-如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com