gpt4 book ai didi

c# - TPL 如何正确取消任务

转载 作者:行者123 更新时间:2023-11-30 12:14:23 26 4
gpt4 key购买 nike

我有以下任务

cancelSource = new CancellationTokenSource();
token = cancelSource.Token;

string strDbA = textBox1.Text;
string strDbB = textBox2.Text;

// Start duplication on seperate thread.
asyncDupSqlProcs =
new Task<bool>(state =>
UtilsDB.DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB), "Duplicating SQL Proceedures");
asyncDupSqlProcs.Start();
asyncDupSqlProcs.ContinueWith(task =>
{
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.Faulted:
// Error-handling logic...
break;
case TaskStatus.RanToCompletion:
if (asyncDupSqlProcs.Result)
Utils.InfoMsg(String.Format(
"SQL stored procedures and functions successfully copied from '{0}' " +
"to '{1}'", strDbA, strDbB));
break;
case TaskStatus.Canceled:
Utils.InfoMsg("Copy cancelled at users request.");
break;
}
}, TaskScheduler.FromCurrentSynchronizationContext());

在方法 DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB) 中,我有标准的取消检测:

if (_token.IsCancellationRequested)
_token.ThrowIfCancellationRequested();

取消事件是单击主窗体上的按钮,在我的单击事件中:

try
{
cancelSource.Cancel();
asyncDupSqlProcs.Wait();
}
catch (AggregateException aggEx)
{
if (aggEx.InnerException is OperationCanceledException)
Utils.InfoMsg("Copy cancelled at users request.");
}

但我似乎可以捕捉到 AggregateException,我在这里做错了什么?

编辑:在方法 DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB) 中,我可以捕获 OperationCancelledException 但我对如何处理它感到困惑。我看到的所有示例都在导致取消的事件中处理在 UI 线程上打印“操作取消...”等。捕获取消并将其传回 UI/调用线程的最佳方法是什么?

最佳答案

这很可能与 Visual Studio 中的“仅我的代码”模式(默认选中)有关。调试器在 TPL 可以观察到异常之前中断。尝试取消选中该框,看看是否可以解决问题(工具->选项->调试->常规,然后取消选中该框)

关于c# - TPL 如何正确取消任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9624350/

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