我遇到了一种情况,我必须使用为 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/