我有一个库调用,我需要在超时中包装,因为它会挂起某些输入。
Task.Wait(timeout)
似乎是最简单的方法。但它没有做我期望的事情。这是一个测试用例(对于类似linqpad的测试环境):
class A { public int X; }
public static void Main() {
var o = new A { X = 0 };
new Task(() => { o.X = 1; }).RunSynchronously();
o.X.Dump(); // Says "1" immediately
new Task(() => { o.X = 2; }).Wait(2000);
o.X.Dump(); // Says "1" after 2 seconds
}
为什么第二次通话超时,从不执行任务?我误解了API吗?
更新:@ ThomasLevesque的回答是正确的,我需要Run
任务。但是,我现在发现Wait
超时无效。我的实际案例涉及SmartXLS组件。我替换了这个
// hangs for some workbooks (as in, never returns and hoses the process, or falls to request timeout)
rangeDefinition = _workbook.getDefinedName(rangeName);
用这个
// exactly the same as above. Timeout has no effect.
var task = Task<string>.Run(() => _workbook.getDefinedName(rangeName));
if (!task.Wait(millisecondsTimeout: 4000)) {
throw new Exception("Could not read range " + rangeName);
}
rangeDefinition = task.Result;
答案 0 :(得分:6)
因为你的第二个任务从未真正开始(这也解释了为什么X仍然是1,而不是2),所以它无法完成。通常,您不应使用Task
构造函数,而应使用Task.Run
或Task.Factory.StartNew
方法。