【问题标题】:How can I delete/release resources of a Task from UI?如何从 UI 中删除/释放任务的资源?
【发布时间】:2013-04-19 14:40:24
【问题描述】:

从UI,我创建了一些Task,比如:

Task taskCancellaCartellaDestinazione = Task.Factory.StartNew(() => CancellaCartellaDestinazione(), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
taskCancellaCartellaDestinazione.ContinueWith(t => TaskGestioneCartelle(), CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

每个Task 都有自己的变量名,所以我可以直接访问它。如何停止和释放它们的资源?

比如我点击停止Button,线程必须停止。

taskCancellaCartellaDestinazione 上我看不到任何Abort()Cancel() 函数。

【问题讨论】:

  • 我不确定 Task 是否是这里的最佳选择。你试过支持取消的BackgroundWorker吗?
  • 我不知道BackgroundWorker是什么。
  • 请查看我写的这个简单示例:pastebin.com/69MDnKx5 要取消它,您只需在您的工作人员上调用 CancelAsync()。
  • @PiotrJustyna 请注意,除非DoWork 方法定期检查是否取消,否则调用CancelAsync 不会执行任何操作。
  • @Servy 是的。不过,我不打算在 OP 上强制使用任何取消机制。只是显示任务的替代方案。

标签: c# multithreading winforms task


【解决方案1】:
  1. 在开始任务之前创建一个CancellationTokenSource

  2. CancellationToken从令牌源传递给CancellaCartellaDestinazione

  3. CancellaCartellaDestinazione的正文中定期检查取消令牌是否已请求取消,在大多数情况下调用ThrowIfCancellationRequested()是合适的。

  4. 将该取消令牌传递给StartNew,而不是CancellationToken.None

  5. 当您想取消任务时,请在CancellationTokenSource 上拨打Cancel

【讨论】:

  • 哦,现在我明白你的意思了!如果我想停止所有线程,我可以对所有线程使用var ts = new CancellationTokenSource(); 吗?
  • @markzzz 我不确定有什么不明白的。您在希望允许取消任务的各个点使用token.ThrowIfCancellationRequested 乱扔代码。确保将其传递给已启动的任何长时间运行的子任务。在大多数情况下,如果您有一个可以完成大部分工作的循环,那么在该循环中调用一次就足够了。关键是,当您调用 Cancel 时,它实际上不会停止任务,直到您下次调用 ThrowIfCancellationRequested
  • @markzzz 当然。如果您知道它们将一起被取消,则可以使用单一来源。
  • 是的,我正在使用ct.IsCancellationRequested。只是我想知道我是否可以为每个线程使用相同的令牌!
猜你喜欢
  • 2015-03-15
  • 2020-02-14
  • 1970-01-01
  • 2015-03-29
  • 2019-08-12
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多