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

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)

Tho*_*que 6

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