【发布时间】:2018-11-01 21:27:25
【问题描述】:
所以我有以下内容:
if (await Task.WhenAny(myLongRunningTask, Task.Delay(9000)) != myLongRunnnigTask && !myLongRunningTask.IsFaulted)
{
Console.WriteLine("TimedOut");
}
else
{
Console.WriteLine("Completed");
}
我完成任务后似乎工作正常;但如果我从未完成长时间运行的任务,那么这只是挂起而不是在 9 秒后超时。甚至进行有缺陷的测试以确保。
(注意:真正的代码不仅仅是命令行编写;但它甚至从未进入范围;尽管我也尝试过命令行编写......没有变化。)
但在我看来,在 LinqPad 中做的事情完全一样:
async void Main()
{
var Other = Task.Factory.StartNew(() => { Thread.Sleep(15000); });
if(await Task.WhenAny(Other, Task.Delay(4000)) != Other && !Other.IsFaulted) "TimedOut".Dump();
else "Completed".Dump();
Other = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
if(await Task.WhenAny(Other, Task.Delay(4000)) != Other && !Other.IsFaulted) "TimedOut".Dump();
else "Completed".Dump();
}
那愉快地写了 TimedOut 然后 Completed。
第一个代码部分位于一个非常庞大的模块中。但我看不出这种奇怪的行为会产生什么副作用......我可能会错过什么?
关于已接受答案的说明:
这里的问题是什么可能会产生副作用。 @Douglas 的回答表明了影响我的代码的副作用。这不一定能解决问题;只是告诉你你的问题出在哪里。不过,他添加了一条评论,其中包含一篇文章的链接,该链接确实可以帮助您解决问题。
【问题讨论】:
-
您使用此 sn-p 的完整示例按预期工作这一事实意味着您已明确证明问题出在其他代码中。如果不知道该代码是什么,就不可能说出它为什么不起作用。
-
如果您能提供minimal reproducible example,那就太好了。
-
是的,我同意这两点。问题是针对“可能”做出的贡献。我同意这几乎可以肯定是一个副作用。但是我不知道应该尝试进一步隔离什么。如果我可以制作完整且可验证的示例,我希望我能很好地解决问题。
-
to what 'could' be contributing这个问题太笼统了。没有必要问什么会起作用(尽管我在下面的回答是最可能的原因) - 如果您向我们展示代码,我们可以找出原因是什么是。 -
虽然我完全理解你的观点,这太宽泛了;这是我花了很长时间试图孤立的东西。这篇文章很绝望,谢天谢地,道格拉斯的回答解决了我的问题。那就是说我仍然对你的@mjwills +1,因为我确实需要重新审视其他用例以确保。所以谢谢大家。
标签: c# .net task-parallel-library