杀死/中止/停止使用Task.Factory.StartNew()创建的任务

时间:2016-04-01 19:57:33

标签: c# multithreading .net-4.0 task

我遇到的情况是我不得不使用为谷歌驱动器创建的异步方法(我没有制作的,我只是使用API​​)无法识别或响应CancelationToken传入。

注意:这与阻止主UI无关。这里情况不同。如上所述,这是一个ASYNC方法!这是关于不让任务变得胭脂和下落不明。这是关于杀死任何无法在后台运行的死任务。

正因为如此(尽管我不喜欢强行杀死线程/进程),当我达到超时时,我将被迫手动杀死它。

Async方法返回任务<>得到了。所以有了这个任务,我该如何有力地杀死它?我需要以某种方式获得PID吗?

UPDATE:

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

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;
}

1 个答案:

答案 0 :(得分:1)

你无法杀死它。您需要以尽管API方法仍在运行的方式继续执行来编写代码。您可以这样做,例如,通过说await Task.WhenAny(apiTask, cancellationToken)