商业案例:
我有一个ASMX web service
从某个远程目录复制/删除/下载文件。MyWebMethod
创建了一个执行所有这些操作的业务类的实例。在下载的情况下,我检查哪个文件是最新的并下载它。下载后,我想立即删除它。但是,在多线程场景中,我尝试删除的文件很可能已被其他线程删除。
我的解决方案:
为避免此类问题,我希望 Web 服务一次只执行一个线程。对 的任何其他调用都WebMethod
应该等到前一个线程完成下载和删除操作。
为此,我static
在我的商务舱中声明了一个变量。WebMethod
在业务类中我的业务方法(从 调用)开始时,我lock
在这个静态对象上调用 。因此,其他 Web 服务调用将不会执行业务方法中的代码,直到该lock
静态变量(对象)未被释放。
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 服务中执行一个线程?请注意,我只想为下载执行此操作。上传应该在并行线程中工作。
- 有更好的解决方案吗?
我正在使用 .NET 4.0。