- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我这里有一个简单的程序
private static void CancellingSingleTask()
{
DateTime whenStarted = DateTime.Now;
Console.WriteLine("[{0}] - Main: Started", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task task = Task.Factory.StartNew(() =>
{
int? taskId = Task.CurrentId;
Console.WriteLine("[{0}] - Task - [{1}]: Started", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks), taskId);
Thread.Sleep(2000);
if (ct.IsCancellationRequested)
{
Console.WriteLine("[{0}] - Task - [{1}]: Cancellation Requested", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks), taskId);
throw new OperationCanceledException();
}
Console.WriteLine("[{0}] - Task - [{1}]: No Cancellation Requested", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks), taskId);
}, ct);
Action Print = () =>
{
Console.WriteLine("[{0}] - Main: Task.IsCanceled = [{1}] Task.IsFaulted = [{2}] Task.IsCompleted = [{3}] Task.Status = [{4}]", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks),
task.IsCanceled, task.IsFaulted, task.IsCompleted, task.Status);
};
Console.WriteLine("[{0}] - Main: Started New Task", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
Print();
Thread.Sleep(1000);
Console.WriteLine("[{0}] - Main: Cancelling Task", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
cts.Cancel();
Thread.Sleep(2000);
Console.WriteLine("[{0}] - Main: After Cancelling Task", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
Print();
try
{
Console.WriteLine("[{0}] - Main: Waiting For Task", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
task.Wait();
Console.WriteLine("[{0}] - Main: After Waiting For Task", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
Print();
}
catch (AggregateException aggregateException)
{
Thread.Sleep(2000);
Console.WriteLine("[{0}] - Main: In Catch Block", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks));
Print();
foreach (var exception in aggregateException.InnerExceptions)
{
Console.WriteLine("[{0}] - Main: Received Exception In Task [{1}]", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks), exception.Message);
}
}
}
示例输出
[00:00:00.0010000] - 主线:开始
[00:00:00.0040002] - 主要:开始新任务
[00:00:00.0060003] - 主要:IsCanceled = [False] IsFaulted = [False] IsCompleted = [False] Status = [Running]
[00:00:00.0070004] - 任务 - [1]:开始
[00:00:01.0070576] - 主要:取消任务
[00:00:02.0071148] - 任务 - [1]:请求取消
[00:00:03.0111722] - 主要:取消任务后
[00:00:03.0111722] - 主要:IsCanceled = [False] IsFaulted = [True] IsCompleted = [True] Status = [Faulted]
[00:00:03.0111722] - 主要:WAITING任务
[00:00:05.0112866] - 主要:在 Catch block 中
[00:00:05.0112866] - 主要:IsCanceled = [False] IsFaulted = [True] IsCompleted = [True] Status = [Faulted]
[00:00:05.0112866] - Main:在任务中收到异常 [操作已取消。]
我从来没有看到 Task.IsCanceled 设置为 true,我是在犯错还是遗漏了一些明显的东西。我对这个问题进行了一些研究/搜索,但未能找到决定性的答案。
注意:StackOverFlow 上的相关问题 Cancellation of a task task IsCanceled is false, while I canceled Task.IsCancelled doesn't work
最佳答案
我想您应该将 CancellationToken
传递给 OperationCanceledException
的构造函数。
if (ct.IsCancellationRequested)
{
Console.WriteLine("[{0}] - Task - [{1}]: Cancellation Requested", TimeSpan.FromTicks(DateTime.Now.Ticks - whenStarted.Ticks), taskId);
throw new OperationCanceledException(ct);
}
TPL 将检查两个 CancellationToken
是否相同,如果相同,它会将任务标记为 Cancelled
在您的情况下它不是,因此 TPL 假定您的任务未取消。
或者甚至更好地使用 ThrowIfCancellationRequested
方法,就这么简单
ct.ThrowIfCancellationRequested();
关于c# - 为什么 Task.IsCanceled 不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782110/
我有以下示例代码: static class Program { static void Main() { var cts = new CancellationToke
我想取消异步任务并停止其后台执行,我在这个问题中找到了解决方案,: Android - Cancel AsyncTask Forcefully 但实际上,我在 asynctask 中的代码是将一些数据
我正在处理相当多的遗留 AsyncTask 代码,并且必须自己在我们的代码库中编写一些。但是,仔细阅读文档中的 cancel() 方法让我很困惑。文档说: Attempts to cancel exe
我的 doInBackground() 方法中有一个特定命令,该命令持续时间约为 20 秒。理想情况下,我可以在用户取消任务后立即中断它,但由于程序在完成之前不会通过该命令,所以无论如何它最终都会花费
我有一个应用程序,我可以在其中连接到 Web 服务以检索数据。我正在使用 AsyncTask 来执行此操作。这是我在 doInBackground 中使用的一段代码: publishProgress(
现状 我已经创建了一个自定义的 NSOperation 对象,我想在它被取消时更新一些数据。 我已按照 this answer 中的说明进行操作而且我没有覆盖cancel方法。 这是我的标题: //
我这里有一个简单的程序 private static void CancellingSingleTask() { DateTime whenStarted = DateTime.Now;
当我取消任务时,等待结果仍然为 IsCanceled 属性返回 true。似乎出了点问题。 请指教。这是代码: CancellationTokenSource _cancelLationToken =
我意识到当我使用属性 IsCancel = True 设置退出按钮时,窗口的 Closing 事件将触发两次。 private void exitButton_Click(object sen
这个问题已经有答案了: how to cancel out of operation created with addOperationWithBlock? (2 个回答) 已关闭 9 年前。 所以,
这个问题已经有答案了: Trying to stop swingworker (4 个回答) 已关闭 9 年前。 我创建了一个有 3 个按钮的 GUI;连接、断开、中止。它们都共享一个公共(publi
所以我在 SwingWorker 中有 isCancelled 的代码 boolean isCancelled() return true; 它给了我错误 attempting to assign w
我有这个异步方法: private static async Task Initializ( ) { /*Do Stuff Here*/ } 我希望能够监控调用此函数所产生的任务: Task T =
我无法弄清楚如何让用户登录我的应用程序。 [FBSDKAccessToken currentAccessToken] 为 nil,所以我调用: [[[FBSDKLoginManager alloc]
本文整理了Java中org.bukkit.event.weather.WeatherChangeEvent.isCancelled()方法的一些代码示例,展示了WeatherChangeEvent.i
我正在使用 React-native 构建一个小应用程序(我认为这不相关)。 该应用程序最终转到 Facebook 请求授权。 但是当我点击确定时,我被发送到一个 isCancelled 回调。 这是
什么时候Task.IsCanceled = true; 代码: var cts = new CancellationTokenSource(); string result = ""; cts.Can
本文整理了Java中org.apache.hadoop.hdfs.protocol.ZoneReencryptionStatus.isCanceled()方法的一些代码示例,展示了ZoneReencr
我一直在想,您能否将 cancel/cancelAllOperations/.isCancelled 与您使用 GCD 启动的线程一起使用? 目前,我只是使用一个 bool 值作为标志,以取消后台进程
如果我在与取消 token 关联的任务中调用 cancellationTokenSource.Cancel,则会正确抛出 OperationCancelledException,但是,task.IsC
我是一名优秀的程序员,十分优秀!