【问题标题】:Execute code after return返回后执行代码
【发布时间】:2017-12-11 10:24:57
【问题描述】:

在我的 Web API 上,我想在我的 return 语句之后删除一个文件夹。

public string Post(HttpRequestMessage request)
{
    //Do cool stuff with request
    try
    {
        return "10.0.2.2:8080/myFolder/index.html";
    }
    finally
    {
        Thread.Sleep(60000);
        Directory.Delete(myFolder, true);
    }
}

我所期望的是制作POST 的设备可以获得返回语句并加载html 文件。一分钟后,我们删除此文件以释放服务器上的空间。

实际情况是,return 语句实际上是在 finally 语句之后发送的。

如何在延迟返回语句之后运行代码,而不延迟返回?

【问题讨论】:

  • 你尝试做的事情是不可能的,在得到响应后从调用方法处理操作
  • 我无法创建一个带有thread.sleep 的异步任务?或者您是在告诉我我需要设备来对 Web API 进行DELETE 调用?
  • 一旦返回,方法就结束了。您可以使用Task.Delay(60000) 开始任务。
  • finally 块实际上会在方法返回之前执行。您当前的代码会阻塞一分钟,删除文件夹然后返回。 dotnetfiddle.net/tReb0v
  • 为什么不直接返回文件内容呢?您正在创建此文件的服务与使用该文件的客户端之间创建紧密耦合。您正在创建一个资源,将一个指向该资源的指针交给客户端,然后尝试猜测该客户端何时会使用该资源,以便您可以清理它。这似乎是一个糟糕的设计选择。

标签: c# thread-sleep try-finally


【解决方案1】:

没有办法做到这一点,而且无论如何都会很糟糕,因为你会让资源(例如网络服务器线程)忙于等待。

编写另一个进程(如果您在 Windows 上,最好是 Windows 服务)定期检查目录并删除特定年龄的所有文件。

【讨论】:

  • 这是它的实际运行方式。但是人们不阅读文档,忘记了这个任务,他们建立了一个新的服务器。
  • @BeGreen 然后让它更明显(提示)或更容易访问(设置)。如果它存在但人们不使用它,因为他们不知道(或忘记)它,这是一个可用性问题。
  • 嗯,在我看来,“没有办法”实际上并不是真的。例如,您可以在托管环境中排队后台工作。但由于这需要高级知识(即异常处理等),我不会将此作为附加答案添加。没有冒犯(真的!每个人都以某种方式开始),但我认为需要关于try..finally 如何工作的建议的人也许应该坚持重构。无论如何,this posting 可能是进一步阅读的良好起点。
【解决方案2】:

返回后不能执行代码 在我看来,如果在 1m 之前创建的文件将其删除,您可以检查文件

DirectoryInfo objDirectoryInfo = new 
                DirectoryInfo(Server.MapPath("~/files"));
foreach (FileInfo File in objDirectoryInfo.GetFiles) {
    if ((File.LastAccessTime < DateTime.Now.AddMinutes(-1))) {
        File.Delete();
    }
}

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2021-06-14
    • 2021-08-25
    • 2016-10-01
    相关资源
    最近更新 更多