终止/中止/停止使用Task.Factory.StartNew()创建的任务
本文关键字:StartNew 任务 Factory 创建 Task 中止 终止 | 更新日期: 2024-05-25 14:13:38
我遇到的情况是,我必须使用为google驱动器创建的Async方法(我没有创建该方法,我只是使用API),该方法无法识别或响应传入的CancelationToken。
注意:这与阻塞主UI无关。这里的情况并非如此。正如我上面所说,这是一个ASYNC方法!这是关于不让任务变成红色和下落不明。这是关于杀死那些不会去任何地方并且在后台运行的死任务
正因为如此(尽管我不喜欢强行杀死线程/进程),但当超时时,我将被迫手动杀死它。
Async方法返回一个Task<>被创造出来。那么,对于这项任务,我该如何强行杀死它呢?我需要先获取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)
。