为什么Task.Wait(timeout)不会立即返回同步的单操作任务?

时间:2014-02-08 19:20:10

标签: .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
}

为什么第二次通话超时,从不执行任务?我误解了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;

1 个答案:

答案 0 :(得分:6)

因为你的第二个任务从未真正开始(这也解释了为什么X仍然是1,而不是2),所以它无法完成。通常,您不应使用Task构造函数,而应使用Task.RunTask.Factory.StartNew方法。