Vb.net NET中的工作线程同步

Vb.net NET中的工作线程同步,vb.net,thread-safety,Vb.net,Thread Safety,我知道ASP.NET有工作线程和IO线程。您还可以使用:System.Threading.Thread创建自己的线程 请参阅下面的代码: SyncLock myLogFile myLogFile.WriteLine("message"); End SyncLock 如果未在ASP.NET应用程序中创建System.Thread的任何实例,那么是否需要同步对日志文件的访问?如果有多个用户同时访问web应用程序,则可能意味着多个工作线程同时写入日志文件 我读过这样的问题,但我还没有找到答案

我知道ASP.NET有工作线程和IO线程。您还可以使用:System.Threading.Thread创建自己的线程

请参阅下面的代码:

SyncLock myLogFile
    myLogFile.WriteLine("message");
End SyncLock
如果未在ASP.NET应用程序中创建System.Thread的任何实例,那么是否需要同步对日志文件的访问?如果有多个用户同时访问web应用程序,则可能意味着多个工作线程同时写入日志文件

我读过这样的问题,但我还没有找到答案


实际上,我使用Log4Net登录.NET应用程序。这个问题的目的是满足好奇心。

同步的需要取决于您的工作。在单线程应用程序中,您不需要同步线程,因为只有一个线程,所以不会遇到任何线程问题—没有多个线程可以访问的共享资源

在多线程应用程序中,同步的需要取决于您试图访问的资源。如果您不尝试访问任何共享资源(也就是说,每个线程只处理线程本地的数据),那么就不需要进行同步,因此不需要锁定。不过,这是一种非常罕见的情况

ASP.NET是高度多线程的,但大多数同步都是由IIS或ASP.NET框架为您完成的,因此除非您尝试在线程之间共享资源,否则您无需自行启动。通常,当一个请求进入时,您会得到一些数据并生成一个响应—您不需要显式同步,因为
应用程序
会话
等已经同步

但是,如果您尝试从请求处理线程写入同一日志文件,则需要显式同步-ASP.NET不知道您的文件,但如果有多个线程尝试在没有保护的情况下读取/写入文件,则会导致问题。在这种情况下,您肯定需要同步,除非有人已经在为您进行同步。如果您使用log4net——正如Hans Passant评论的那样——它已经处理好了,所以您不必这样做


例如,如果您尝试读取/写入XML文件(不使用任何其他包装器库),则必须使用
lock
-s或其他同步原语来保护该文件-一个线程可能正在写入该文件,而其他几个线程可能正试图同时读取该文件。为了防止读卡器获取垃圾数据(假设CPU中断写入以切换到其他线程),您需要防止读卡器读取,直到写入完成。

您的问题不清楚。您是在问log4Net如何在多线程的.net应用程序(如asp.net)中进行日志记录吗?@DeoWalk,我是在问单线程的asp.net应用程序(即不显式创建线程(System.Threading.Thread)中是否需要同步不,当然不需要。Log4Net已经包含了这样一个锁。@Hans Passant,我在问题中引用Log4Net的原因是不鼓励回答“请使用Log4Net进行日志记录”(就像我在示例代码中使用日志记录一样)。我特别想问的是,在单线程的.NET应用程序中是否需要同步,因为.NET应用程序有多个工作线程。@w0051977不,在单线程的应用程序中永远不需要同步。为什么你说“单线程”呢?您的问题是关于多线程应用程序的。创建主线程以外的线程后,几乎总是需要同步。谢谢,但是asp.net有工作线程。如果86个用户同时访问该网站,那么不会创建86个线程吗?@w0051977是的,将创建86个工作线程。每个请求都在单独的线程上处理。根据系统资源的不同,线程池可能没有足够的线程-在这种情况下,使用的工作线程更少,剩余的请求进入队列。谢谢。您的回答表明框架处理了这个问题?@w0051977框架处理它的某些部分。内部ASP.NET对象是同步的,但如果您试图共享自己的资源,则必须提供自己的同步。@w0051977 log4net在内部同步文件访问,因此您不必这样做。他们为你做了这项工作,但在其他情况下,你必须这样做。