我遇到的情况是我不得不使用为谷歌驱动器创建的异步方法(我没有制作的,我只是使用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;
}
答案 0 :(得分:1)
你无法杀死它。您需要以尽管API方法仍在运行的方式继续执行来编写代码。您可以这样做,例如,通过说await Task.WhenAny(apiTask, cancellationToken)
。