【发布时间】:2017-03-09 13:29:16
【问题描述】:
我的 ASP.NET 站点中有不能由 2 个线程或进程同时运行的代码,因此我将其锁定。假设只有一个进程,这是可行的,并且由于 IIS 中的“最大工作进程”设置为 1,我觉得这是合理的。然而,我做了一个让我想知道的实验:
我创建了这个动作:
public void Test()
{
for (int i = 0; i < 100; i++)
{
System.IO.File.AppendAllText(@"c:\tmp\d.txt", $"a: {i}\n");
System.Threading.Thread.Sleep(1000);
}
}
并从我的浏览器中调用它。然后我将a: 切换到b:,编译它,然后从另一个浏览器选项卡中调用它。然后我打开d.txt,看到的是这样的:
b: 31
a: 67
b: 32
a: 68
b: 33
a: 69
显然有2个进程同时运行,我的锁会不够用。确保我的一段代码不会同时运行的最佳方法是什么?
【问题讨论】:
-
使用写锁打开文件,写入打开的流,完成后处理关闭文件的流(只需将整个内容包装在 using 块中)。如果文件已经打开,如何处理遇到初始异常的其他线程尚不清楚,这取决于您的逻辑。您不能使用锁甚至互斥锁,这些在网络场架构中都不是线程安全的,因此如果您希望您的站点在多个 Web 服务器之间实现负载平衡,那么这种方法(锁或互斥锁)将无法正常工作。
-
@Igor 我的代码没有打开任何文件。这只是为了证明2个进程可以同时运行的一个测试动作。
-
my code does not open any filesSystem.IO.File.AppendAllText 会做什么? -
@wezten 好的。如果你真的需要帮助解释你在做什么,并给我们一些实际示例代码
-
你没看第二句吗?请在回复之前阅读整个评论。
... If there are multiple entry points on the same server use a named mutex.