我有网页 index.aspx 和相应的服务器端代码 index.aspx.cs。如果多个客户端连接到我的网站,此 C# 代码有一个无法并行执行的方法。我该如何限制这个?
这是该方法的作用。它创建一个文件夹,将其压缩并提供给用户下载。我的要求是,当一个用户执行此方法时,其他一些用户不应该这样做,因为它会再次创建相同的文件夹,从而导致数据损坏。
我尝试使用 Session 对象。但我开始知道会话对象是按客户端存储的。
谁能建议我一些解决方案?
我有网页 index.aspx 和相应的服务器端代码 index.aspx.cs。如果多个客户端连接到我的网站,此 C# 代码有一个无法并行执行的方法。我该如何限制这个?
这是该方法的作用。它创建一个文件夹,将其压缩并提供给用户下载。我的要求是,当一个用户执行此方法时,其他一些用户不应该这样做,因为它会再次创建相同的文件夹,从而导致数据损坏。
我尝试使用 Session 对象。但我开始知道会话对象是按客户端存储的。
谁能建议我一些解决方案?
应用程序上下文或静态类是应用程序范围的。因此,您可以存储一个标志,表明该过程已经开始。进程结束后,您可以删除该标志。
http://msdn.microsoft.com/en-us/library/94xkskdf(v=vs.100).aspx
并且始终Application.Lock
在您写入应用程序状态和lock(mutex)
使用静态类时使用。
在您的情况下,静态类将是一个更好的解决方案,因为似乎应用程序上下文的存在仅用于与经典 asp 兼容的目的:在 ASP.NET 中使用静态变量而不是应用程序状态
static object mutex= new object();
lock(mutex)
{
//Do the work
}
我的直接建议是:为每个请求创建一个随机文件夹名称,这样您就可以同时运行它们。但是,如果这不是一个选项,那么您将需要使用类似lock
或Mutex
. 但是,这只有在您从当前请求返回结果而不是将其压缩到一个请求中并让他们在下一个请求中下载时才能正常工作。
不过,坦率地说,我认为您应该在 zip请求中执行 zip。事实上,除非文件很大,否则您甚至不需要接触文件系统 - 您可以使用MemoryStream
任何 zip 编码器(System.IO.Packaging.ZipPackage
例如)在内存中创建一个 zip - 然后只需将数据交给客户端MemoryStream
.
如果您使用的是 MVC,这只是return File(contents, contentType)
. 使用 vanilla ASP.NET,您需要更多步骤。
如果您使用经典的 asp.net 会话,则无需执行任何操作,因为会话就绪会锁定来自多个用户的页面运行。
如果你没有,那么你可以按照 Marc 的建议,使用Mutex
.
关于会话锁定:
Web 应用程序在共享同一会话时处理另一个 Web 应用程序时被阻止
对 Web 服务的 jQuery Ajax 调用似乎是同步的
ASP.NET 服务器不会异步处理页面
完全替换 ASP.Net 的会话