在我的MVC网站项目中,我需要取消调用代码,如果它通过超时,我写下面的代码,它在没有超时时正确返回预期结果,但是当超时时,代码返回主线程但是子任务仍在运行(我检查过任务管理器,看到IIS工作线程使用了很多硬件),我不知道它有什么问题。
private static object GetCandidateOutput(MethodInfo mi, object o, string[][] input)
{
var cancellationToken = new CancellationTokenSource();
var task = Task.Run(() => mi.Invoke(o, input), cancellationToken.Token);
if (task.Wait(TimeSpan.FromSeconds(3)))
{
return task.Result;
}
else
{
cancellationToken.Cancel();
throw new Exception("Timed out");
}
}
答案 0 :(得分:0)
我明白了,下面是工作代码:
var cts = new CancellationTokenSource();
var newTask = Task.Factory.StartNew(state =>
{
var token = (CancellationToken)state;
if (!token.IsCancellationRequested)
{
var invokeInput = new object[] { input };
var output = mi.Invoke(o, invokeInput);
}
}, cts.Token, cts.Token);
if (!newTask.Wait(timeout, cts.Token))
{
cts.Cancel();
throw new Exception("The operation has timed out.");
}