我知道ASP.NET有工作线程和IO线程。您还可以使用以下命令创建自己的线程:System.Threading.Thread。
请参阅以下代码:
SyncLock myLogFile
myLogFile.WriteLine("message");
End SyncLock
如果在ASP.NET应用程序中没有创建System.Thread的任何实例,那么是否需要同步对日志文件的访问?如果有多个用户同时访问Web应用程序,则可能意味着多个工作线程同时写入日志文件。
我读过这样的问题:Synchronization in multi threading in .net,但我没有找到问题的答案。
我实际上使用Log4Net登录.NET应用程序。这个问题的目的是满足好奇心。
答案 0 :(得分:0)
同步的需要取决于你的工作。在单线程应用程序中,您不需要同步线程,因为只有一个线程,因此您不会遇到任何线程问题 - 没有可由多个线程访问的共享资源。
在多线程应用程序中,同步的需要取决于您尝试访问的资源。如果您不尝试访问任何共享资源(也就是说,每个线程只能使用线程本地的数据),则无需同步,因此您不需要锁定。不过,这是一种非常罕见的情况。
ASP.NET是多线程的,但大多数同步是由IIS或ASP.NET框架为您完成的,因此除非您尝试在线程之间共享资源,否则无需自行滚动。通常会有一个请求,您获得一些数据并生成响应 - 您不需要显式同步,因为Application
,Session
等已经同步。
但是,如果尝试从请求处理线程写入相同的日志文件,则需要显式同步 - ASP.NET不知道您的文件,但有多个线程尝试读取/写入文件保护会导致问题。在这种情况下,你肯定需要同步 - 除非有人已经为你做了。如果您使用log4net - 正如Hans Passant所评论的那样 - 它已经完成了它,所以您不必这样做。
如果您尝试读取/写入XML文件(例如,不使用任何其他包装器库),则必须使用lock
- s或其他同步原语来保护文件 - 一个线程可能正在写它,而其他几个人可能试图同时阅读它。为了防止读者获取垃圾数据(想象一下写入被CPU中断以切换到另一个线程),您需要阻止读者读取,直到写入完成。