gpt4 book ai didi

c# - 有没有一种方法可以使正在运行的方法通过 cts.Cancel(); 立即停止?

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:05 24 4
gpt4 key购买 nike

我有创建 CancellationTokenSource 并将其传递给方法的代码。

我在另一个发出 cts.Cancel() 的应用程序中有代码;

有没有一种方法可以使该方法立即停止,而不必等待 while 循环中的两行代码完成?

请注意,如果它导致我可以处理的异常,我会没事的。

public async Task OnAppearing()
{
cts = new CancellationTokenSource();
await GetCards(cts.Token);
}

public async Task GetCards(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
App.viewablePhrases = App.DB.GetViewablePhrases(Settings.Mode, Settings.Pts);
await CheckAvailability();
}
}

最佳答案

我的建议:

  1. 修改 GetViewablePhrases 和 CheckAvailability,以便您可以将 CancellationToken 传递给它们;
  2. 使用ct.ThrowIfCancellationRequested()在这些函数中;
  3. 尝试/捕获 GetCards 中的 OperationCanceledException;

至于你的函数,我不知道它们在内部是如何工作的。但是让我们假设您在其中一个内部有一个长时间运行的迭代:

CheckAvailability(CancellationToken ct)
{
for(;;)
{
// if cts.Cancel() was executed - this method throws the OperationCanceledException
// if it wasn't the method does nothing
ct.ThrowIfCancellationRequested();
...calculations...
}
}

或者假设您要在其中一个函数中访问您的数据库,并且您知道这个过程需要一段时间:

CheckAvailability(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
AccessingDatabase();
}

这不仅会阻止您的函数继续执行,还会将执行者任务状态设置为 TaskStatus.Canceled

并且不要忘记捕获异常:

public async Task GetCards(CancellationToken ct)
{
try
{
App.viewablePhrases = App.DB.GetViewablePhrases(Settings.Mode, Settings.Pts, ct);
await CheckAvailability(ct);
}
catch(OperationCanceledException ex)
{
// handle the cancelation...
}
catch
{
// handle the unexpected exception
}
}

关于c# - 有没有一种方法可以使正在运行的方法通过 cts.Cancel(); 立即停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243161/

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