C#--安全的多线程保存文件访问

C#--安全的多线程保存文件访问,c#,multithreading,logging,save,C#,Multithreading,Logging,Save,我目前正在开发一个C#应用程序,它使用两个独立的线程,第一个线程是程序运行的主线程,第二个线程是日志线程。日志线程基本上是一个循环,大约每秒运行一次,只有在应用程序关闭时才会中断 基本上,如果有消息要输出,日志线程每隔一秒左右就会写入日志文件(文本文件)。我的问题是,在主线程上有一个move函数,它可以更改日志文件(和其他文件)的路径,并将旧文件移动到新位置。我的问题是,如果日志线程正在写入日志文件,而move函数尝试移动该文件,或者反之亦然,会发生什么?我将如何帮助防止这种情况发生 如果我不更

我目前正在开发一个C#应用程序,它使用两个独立的线程,第一个线程是程序运行的主线程,第二个线程是日志线程。日志线程基本上是一个循环,大约每秒运行一次,只有在应用程序关闭时才会中断

基本上,如果有消息要输出,日志线程每隔一秒左右就会写入日志文件(文本文件)。我的问题是,在主线程上有一个move函数,它可以更改日志文件(和其他文件)的路径,并将旧文件移动到新位置。我的问题是,如果日志线程正在写入日志文件,而move函数尝试移动该文件,或者反之亦然,会发生什么?我将如何帮助防止这种情况发生

如果我不更改保存路径,程序运行正常,但我担心如果主线程和日志线程同时尝试对日志文件执行某些操作,它们可能会死锁。我对此做了一些研究,但我能想到的只是阻止多个线程同时读/写一个文件,而不是像我一样移动文件并向其写入。那么,真的有什么方法可以让日志线程告诉主线程它正在使用日志文件,并且当日志文件完成时,主线程可以使用日志文件,反之亦然

多线程是我一直想尝试的东西,但总是因为这类事情的复杂性而推迟。这当然需要更多的逻辑来阻止事情出错

非常感谢您的帮助,因为这是应用程序为防止大规模错误所需的最后一件事情之一(至少我可以说,这才是测试的真正目的)

编辑:
我真正想要的是两个线程在访问日志文件时可以“通信”告诉对方,这样他们就不会试图同时访问同一个文件。

只要你的主线程需要复制文件,我就会一起杀死你的日志线程,然后再开始一个新的日志线程。

你的问题引导了错误的方向,如果你解释你的最终目标是什么,你可能会得到更好的答案

通常这是不同的做法。多个线程记录到内存缓冲区中。每个线程都有自己的缓冲区,因此没有缓冲区争用。当线程的缓冲区已满时,将创建一个新的缓冲区并与该缓冲区交换。日志继续记录到新的缓冲区,而旧的缓冲区被发送到一个线程,该线程的目的只是将缓冲区写入文件并旋转日志文件。这允许多个线程非常快速地登录内存。由于只有一个线程实际与文件交互,因此文件移动操作没有冲突


关于您的问题,假设文件移动不经常发生,您可以使用一个精简的多读单写器锁来实现这一点(如果您有多个线程记录日志,并且只有一个线程移动文件),否则如果您只有两个线程,则使用一个普通锁(obj)语句就足够了。

同时访问该文件不会导致死锁。。不过,这很可能会引发其他问题。“更改保存路径”是什么意思?这只是更改文件的位置(例如变量),还是尝试移动文件本身?(通常windows不允许移动打开的文件。)无论如何,如果这是我的程序——并且我仅限于此一般设计——我将拥有在“日志线程”上完成的对文件的所有访问权限。主线程可以进行设置更改,但这样的更改只能在一个线程上处理。使用适当的线程安全性将此信息传递给日志线程仍然很重要,但这消除了多个线程(在同一程序中)在处理同一文件时异常交互的问题。最常见的“防止大规模错误”的方法是使用现有的解决方案—有大量日志库。考虑清楚你的目标(据我所知,日志记录只是你尝试的一个例子),并展示你所学到的关于你所关注的高处的小样本。(也就是说,很难看出basic
lock
如何保护您的操作)@user2864740是的,通过更改字符串变量来更改位置。更改它使日志文件只被一个线程访问需要一些代码大修(因为其他代码是如何工作的)@AlexeiLevenkov我仍然理解锁,但我会更好地研究它们,看看我能做些什么