【问题标题】:C# Task.Run() stopped working and waits foreverC# Task.Run() 停止工作并永远等待
【发布时间】: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() 的认可,请注意!

标签: c# task


【解决方案1】:

可能你有一个死锁。请参阅此链接https://michaelscodingspot.com/c-deadlocks-in-depth-part-1/。您需要真正知道何时致电.Wait() .Result() .Run(),这三个可能会使您的整个应用程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-06
    • 2015-05-29
    • 2018-11-26
    • 1970-01-01
    • 2013-11-24
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多