Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么不是';t任务。是否立即返回同步的一个操作任务的等待(超时)?_.net_Task Parallel Library - Fatal编程技术网

.net 为什么不是';t任务。是否立即返回同步的一个操作任务的等待(超时)?

.net 为什么不是';t任务。是否立即返回同步的一个操作任务的等待(超时)?,.net,task-parallel-library,.net,Task Parallel Library,我有一个库调用,我需要在一个超时中结束,因为它挂起某些输入 看来,Task.Wait(timeout)是最简单的方法。但它并没有达到我的预期。下面是一个测试用例(对于类似linqpad的测试环境): 为什么第二次呼叫超时,并且从不执行分配?我是不是误解了API 更新:@ThomasLevesque的答案是正确的,我需要运行任务。但是,我现在发现等待超时无效。我的实际案例涉及SmartXLS组件。我换了这个 // hangs for some workbooks (as in, never ret

我有一个库调用,我需要在一个超时中结束,因为它挂起某些输入

看来,
Task.Wait(timeout)
是最简单的方法。但它并没有达到我的预期。下面是一个测试用例(对于类似linqpad的测试环境):

为什么第二次呼叫超时,并且从不执行分配?我是不是误解了API

更新:@ThomasLevesque的答案是正确的,我需要运行任务。但是,我现在发现
等待
超时无效。我的实际案例涉及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;
//与上面完全相同。超时无效。
var task=task.Run(()=>_workbook.getDefinedName(rangeName));
如果(!task.Wait(毫秒刺激:4000)){
抛出新异常(“无法读取范围”+rangeName);
}
rangeDefinition=task.Result;

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

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

谢谢,这也适用于我的实际情况(我需要任务的结果)。谢谢你帮我解答一个基本问题,我是TPL的新手。也就是说。。。它对我的生产案例不起作用。也就是说,即使使用此包装器,库调用仍在超时。这是对托管Excel API的调用。即使它只是完全旋转,调度程序也应该能够将其中断,对吗?@harpo,我不确定我是否理解您的场景。。。你到底想做什么?我有一次调用第三方组件,有时会挂起(试图获取Excel范围的定义)。我猜它陷入了一个无限循环——不确定,代码是模糊的。我需要一种方法来调用它,并为这些情况提供适当的备用方案。我找到的所有资源都指向TPL,但这些超时似乎没有任何效果。感谢您的跟进。我已经把我的实际代码放在问题中了。值得一提的是,我从类似的方法中得到了相同的结果,例如.Thank,这也适用于我的实际情况(我需要任务的结果)。谢谢你帮我解答一个基本问题,我是TPL的新手。也就是说。。。它对我的生产案例不起作用。也就是说,即使使用此包装器,库调用仍在超时。这是对托管Excel API的调用。即使它只是完全旋转,调度程序也应该能够将其中断,对吗?@harpo,我不确定我是否理解您的场景。。。你到底想做什么?我有一次调用第三方组件,有时会挂起(试图获取Excel范围的定义)。我猜它陷入了一个无限循环——不确定,代码是模糊的。我需要一种方法来调用它,并为这些情况提供适当的备用方案。我找到的所有资源都指向TPL,但这些超时似乎没有任何效果。感谢您的跟进。我已经把我的实际代码放在问题中了。值得一提的是,我从类似的方法中得到了相同的结果,例如。
// 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;