2017-12-11 3 views
0

私のWeb APIで、返品明細書の後にフォルダを削除します。私が期待したもの返品後にコードを実行

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を作る装置が、return文を取得し、htmlファイルを読み込むことができることです。 1分後に、このファイルを削除してサーバーの空き領域を解放します。

実際には、returnステートメントはfinallyステートメントの後に実際に送信されます。

返却を遅らせることなく、遅延のある返信文の後にコードを実行するにはどうすればよいですか?

+0

物事を削除する場合は、ファイルを確認することができます私の意見では、戻り 後にコードを実行することができないことから、プロセスの操作はできません応答を取得した後にメソッドを呼び出す –

+0

内部に 'thread.sleep'を持つ非同期タスクを作成できません。あるいは、私は、Web APIへの 'DELETE'呼び出しを行うためにデバイスが必要だと言っていますか? – BeGreen

+1

戻ったら、方法は終了です。 Task.Delay(60000)でタスクを開始することができます。 – FCin

答えて

3

これを行う方法はありません。とにかくリソース(Webサーバースレッドなど)を待機させておくので、これは悪いことです。

ディレクトリを定期的にチェックし、特定の年齢のすべてのファイルを削除する別のプロセス(Windowsの場合はWindowsサービスが望ましい)を作成します。

+0

実際の実行方法です。しかし、人々はドキュメントを読んでいないし、この作業を忘れて、彼らは新しいサーバーをセットアップした。 – BeGreen

+2

@BeGreen次に、より明白に(ヒント)、アクセスしやすく(設定)してください。それが存在するが、人々がそれを知らない(または忘れる)ためにそれを使用しない場合、それはユーザビリティの問題です。 –

+0

私の意見では、「方法はありません」というのは実際には真実ではありません。たとえば、ホスティング環境でバックグラウンドの作業をキューに入れることができます。しかし、これは高度な知識(すなわち例外処理など)を必要とするので、これを追加の回答として追加しているわけではありません。違反はありません(本当に誰もが何とかしています)が、try..finallyがどのように動作するのかアドバイスが必要な人は、代わりにリファクタリングに固執すべきだと思います。とにかく、[この投稿](https://stackoverflow.com/questions/14710822/how-to-queue-background-tasks-in-asp-net-web-api)は、さらに読むための出発点になるかもしれません。 – Peit

0

あなたが1メートル前に作成されたファイルは、あなたがやろうとしていること

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