【发布时间】:2019-05-01 15:55:37
【问题描述】:
我使用一个用 C# 编写的服务器端应用程序,我像这样执行一个简单的Task.Run:
{
...
Task.Run(() => DeleteFile(path));
...
}
它工作了很多年,但从昨天开始就停止工作,并且根本没有调用 DeleteFile 方法。执行只是继续到下一行代码。我尝试了Task.Run(() => File.Delete(path)),但效果不佳。然后我添加了Task.Wait 如下(带有一个空操作 - 仅用于测试):
Task t = Task.Run(() => {});
t.Wait();
当执行到达t.Wait() 时,它会一直等待并且不会转到下一行代码。
应用程序中我使用 Task.Run 的其他地方工作正常。
可能是什么原因?
【问题讨论】:
-
请分享 DeleteFile 代码....我认为该任务不是问题。
-
等待它而不是使用
t.Wait()。 -
Wait()永远等待,因为你是 blocking on async code。您最初的即发即弃版本很可能停止工作,因为它现在会产生异常 which you cannot see。 -
你绝对确定
DeleteFile没有被调用,而 inside 它失败了?接下来要看的是“同步上下文”——你的服务器有同步上下文吗?有人可能添加了一个吗?SynchronizationContext.Current报告什么? -
@GSerg 调用
Wait()是一个糟糕的想法,但它实际上不应该失败,除非存在同步上下文死锁(或类似情况);这不是对.Wait()的认可,请注意!