.net中多线程同步

时间:2010-09-10 19:41:12

标签: vb.net

我对多线程中的同步有疑问。

我有一个名为send的函数,我在每个数据行的for循环中调用它。

此功能创建线程以向不同的人发送电子邮件。

Public Sub send(ByVal Conn As Data.DataRow, ByVal job As Data.DataRow) MyThread = New Thread(AddressOf Me.start) MyThread.Start() End Sub

但是创建的每个线程都是在不同的时间点写入日志文件。因此,2个线程同时写入同一文件的可能性很高。那么,我需要在这里使用任何类型的同步机制吗?或没有它们没事?如果是,可以告诉我使用什么以及在哪里使用。

3 个答案:

答案 0 :(得分:3)

要防止多个线程同时写入,请使用SyncLock。例如,myLogFile是您的日志文件:

SyncLock myLogFile
    myLogFile.WriteLine("message");
End SyncLock

答案 1 :(得分:1)

几种方法:

在调用记录器日志方法之前,您的线程可以获取对记录器对象的锁定。这使得呼叫者有责任锁定。

您可以选择通过管理锁定将锁定责任移动到记录器对象中。见吉姆的回答。

如果您没有将日志记录功能包装到单独的对象中,那么只需在代码中创建一个可以锁定的对象。

此外,除非您知道您将始终拥有少量记录,否则我不会为每条记录生成一个帖子。否则你将创建上下文切换颠簸并伤害perf。查看Thread.QueueUserWorkItem()静态方法。

答案 2 :(得分:-1)

如果一个线程正在阻止该文件,那么您将遇到访问错误,因为它正在写入该文件。您可以处理异常,让当前线程等待,然后写入文件。

boolean AttemptingToWrite = true

while (AttemptingToWrite)
try
   WriteToLog()
   AttemptinToWrite = false
catch(ex as exception
  system.threading.thread.sleep(100)
end try
end while