har*_*rpo 0 .net task-parallel-library
我有一个库调用,我需要在超时中包装,因为它挂起了某些输入.
看来这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
}
Run Code Online (Sandbox Code Playgroud)
为什么第二次呼叫超时,从不执行任务?我误解了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);
Run Code Online (Sandbox Code Playgroud)
有了这个
// 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;
Run Code Online (Sandbox Code Playgroud)
因为你的第二个任务从未真正开始(这也解释了为什么X仍然是1,而不是2),所以它无法完成.通常,您不应该使用Task构造函数,而应使用Task.Run或Task.Factory.StartNew方法.