ビジネスケース:
リモートディレクトリからファイルをASMX web service
コピー/削除/ダウンロードするがあります。MyWebMethod
は、これらすべての操作を実行するビジネス クラスのインスタンスを作成します。ダウンロードの場合、どのファイルが最新かを確認してダウンロードします。ダウンロードしたらすぐに削除したいです。ただし、マルチスレッドのシナリオでは、削除しようとしているファイルが他のスレッドによって既に削除されている可能性があります。
私の解決策:
このような問題を回避するために、一度に 1 つのスレッドのみを Web サービスで実行したいと考えています。へのその他の呼び出しは、WebMethod
前のスレッドがダウンロードおよび削除操作を完了するまで待機する必要があります。
このためstatic
に、ビジネス クラスで 1 つの変数を宣言しました。WebMethod
ビジネス クラスのビジネス メソッド ( から呼び出される) の開始時に、lock
この静的オブジェクトで を呼び出します。lock
したがって、他の Web サービス呼び出しは、その静的変数 (オブジェクト) が解放されない限り、ビジネス メソッドのコードを実行しません。
public class FileOperator
{
private static object locker = new object();
public void DownloadAndDeleteFile(string fileName)
{
lock(locker)
{
// All business logic goes here.
}
}
}
のコードは次のWebMethod
ようになります。
FileOperator fileOperator = new FileOperator();
fileOperator.DownloadAndDeleteFile("File1.txt");
質問:
- 私の解決策は正しいですか?
- はいの場合、Web サービス内から 1 つのスレッドのみを実行できるようにするにはどうすればよいですか? 私はこれをダウンロードのためにのみ行いたいことに注意してください..アップロードは並列スレッドで動作するはずです..
- より良い解決策はありますか?
.NET 4.0 を使用しています。