项目中碰到了静态页文件读写冲突的问题(如果同时存在读写就报黄页,虽然写入是“瞬间”的,但高并发下依然有可能)。
public class ReaderWriterLockHelper
{
static ReaderWriterLock rwl = new ReaderWriterLock();
public static void ReadFromResource(int timeOut, Action readAction)
{
try
{
rwl.AcquireReaderLock(timeOut);
try
{
readAction();
}
finally
{
rwl.ReleaseReaderLock();
}
}
catch (ApplicationException)
{
}
}
public static void WriteToResource(int timeOut, Action writeAction)
{
try
{
rwl.AcquireWriterLock(timeOut);
try
{
writeAction();
}
finally
{
rwl.ReleaseWriterLock();
}
}
catch (ApplicationException)
{
}
}
}
写入:
var thread = new Thread(context =>
{
HttpContext.Current = (HttpContext)context;
var content = TemplateFactory.ReplaceContent(template);
ReaderWriterLockHelper.WriteToResource(10, () =>
{
using (var sw = fileInfo.CreateText())
{
sw.WriteLine(content);
sw.Close();
}
});
});
thread.Start(HttpContext.Current);
读取:
ReaderWriterLockHelper.ReadFromResource(10, () => context.Response.WriteFile(url));
分享到:
相关推荐
C#中解决SQLite数据库并发异常问题的方法主要涉及到多线程环境下读写锁的使用。SQLite是一个轻量级的文件型数据库,它在设计上通过文件锁来管理并发访问。这意味着多个线程可以同时进行读操作,但在同一时间内只有一...
5. **冲突解决**:当多个客户端同时修改同一数据时,需要有冲突检测和解决机制。 6. **断开连接**:完成同步后,客户端和服务器安全地关闭连接。 在“tongbu.rar”文件中,可能包含了实现这些功能的代码示例和库。...
C#提供了多种同步机制,如互斥锁(`Mutex`)、读写锁(`ReaderWriterLock`)、信号量(`Semaphore`)和`Monitor`类,用于保护临界区和实现线程间的同步。 死锁是多线程编程中的一大挑战,发生在两个或更多线程互相等待...
`ReaderWriterLock`和`ReaderWriterLockSlim`类提供了一种高效的读写锁机制,允许多个读取线程同时访问共享资源,但只允许一个写入线程访问资源。 #### 线程池 线程池是一种管理线程的有效方式,它重用一组预先创建...
它优化了传统的互斥锁,使得多个读者可以同时访问共享资源而不会冲突,但当有写者时,所有读写操作都会被阻塞,直到写操作完成。这种设计允许更高的并行度,因为它减少了等待锁的时间。 在传统的互斥锁中,任何时刻...