c# - 终止/中止/停止使用 Task.Factory.StartNew() 创建的任务

标签 c# multithreading .net-4.0 task

我遇到了一种情况,我必须使用为 google 驱动器创建的异步方法(我没有制作该方法,我只是使用 API),该方法无法识别或响应传入的 CancelationToken。

注意:这与阻止主 UI 无关。这里情况不同。正如我上面所说,这是一个 ASYNC 方法!这是为了不让任务变得模糊和下落不明。这是关于杀死那些不会去任何地方并且在后台运行的死任务。

因此(尽管我不喜欢强制终止线程/进程),当超时时,我将被迫手动终止它。

Async 方法返回创建的任务<>。那么对于这个任务,我该如何强行杀死它呢?我需要先以某种方式获取PID吗?

更新:

根据大众的需求,这里是如何创建任务的示例......

private void TryToAuthenticate()
{
  //Cancel the task BEFORE it starts works fine
  //m_cancelTokSrc.Cancel();

  //Start task
  Task<UserCredential> task = GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(stream).Secrets,
    scopes,
    "user",
    m_cancelTokSrc.Token,
    new FileDataStore(m_CredentialFilePath, true))
    .ContinueWith((t) => AuthenticateCompleted(t));

  //Cancel the task AFTER it starts fails and does nothing
  //m_cancelTokSrc.Cancel();
}

private UserCredential AuthenticateCompleted(Task<UserCredential> task)
{
  UserCredential credentials = null;
  switch (task.Status)
  {
    case TaskStatus.Canceled:
      return null;
    case TaskStatus.RanToCompletion:
      credentials = task.Result;
      break;
  }

  return credentials;
}

最佳答案

你杀不了它。您需要以这样的方式编写代码:尽管该 API 方法仍在运行,但仍能继续执行。例如,您可以通过输入 await Task.WhenAny(apiTask, CancellationToken) 来做到这一点。

关于c# - 终止/中止/停止使用 Task.Factory.StartNew() 创建的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36364827/

相关文章:

c# - UnhandledException 在 Windows Phone 上的所有情况下都能正常工作吗?

c++ - Qt:这段代码中的QBuffer线程安全吗?

java - != 检查线程安全吗?

c# - 如何在 WPF C# 应用程序中动态添加复选框

c# - 使用 C# 确定谁打开了文件

c# - Double 未正确存储在 MySQL 数据库中

java - Google App Engine标准+ Firebase数据库

c# - 如何确定谁拥有我的应用程序退出时仍在运行的工作线程?

c# - 从字符串中删除所有内容,包括XYZ

c# - 使用for循环添加任务用于创建限制并发的任务调度程序