以线程安全的方式写入文件将Stringbuilder写入异步文件。此代码控制文件,将流写入其中并释放它。它处理来自异步操作的请求,这些请求可能随时出现。FilePath是按类实例设置的(因此锁定对象是按实例设置的),但由于这些类可能共享FilePaths,因此可能会发生冲突。此类冲突以及来自类实例外部的所有其他类型将通过重试来处理。这段代码是否符合其目的?有没有更好的方法来处理这个问题,意味着更少(或没有)对捕获和重试机制的依赖?另外,如何避免捕获由于其他原因发生的异常。公共字符串文件路径{得到;放;}privateObjectlocker=newObject();publicasyncTaskWriteToFile(StringBuildertext){inttimeOut=100;秒表stopwatch=newStopwatch();秒表.Start();while(true){try{//等待资源空闲(文件,编码.Unicode)){writer.Write(text.ToString());}}休息;}catch{//文件不可用,与其他类实例或应用程序冲突}if(stopwatch.ElapsedMilliseconds>timeOut){//放弃.break;}//等待并重试awaitTask.Delay(5);}秒表.Stop();你如何处理这个在很大程度上取决于你写的频率。如果您不经常写入相对少量的文本,那么只需使用静态锁即可完成。无论如何,这可能是您最好的选择,因为磁盘驱动器一次只能处理一个请求。假设您所有的输出文件都在同一个驱动器上(可能不是一个公平的假设,但请耐心等待),应用程序级别的锁定与操作系统级别的锁定之间没有太大区别。因此,如果您将储物柜声明为:staticobjectlocker=newobject();您可以放心,不会与您程序中的其他线程发生冲突。如果你希望这个东西是防弹的(或者至少是合理的),你就不能逃避捕获异常。可能会发生坏事。您必须以某种方式处理异常。当你遇到错误时你所做的是完全不同的。如果文件被锁定,您可能需要重试几次。如果您收到错误的路径或文件名错误或磁盘已满或任何其他错误,您可能需要终止该程序。同样,这取决于您。但是除非您对程序崩溃时的错误感到满意,否则您无法避免异常处理。顺便说一下,您可以替换所有这些代码:使用(FileStreamfile=newFileStream(Filepath,FileMode.Append,FileAccess.Write,FileShare.Read))writer.Write(text.ToString());只需一个电话:File.AppendAllText(Filepath,text.ToString());假设您使用的是.NET4.0或更高版本。请参见File.AppendAllText。处理这个问题的另一种方法是让线程将它们的消息写入队列,并有一个专门的线程为该队列服务。您有消息和关联文件路径的BlockingCollection。例如:classLogMessage{publicstringFilepath{get;放;}公共字符串文本{得到;放;}}BlockingCollection_logMessages=newBlockingCollection();您的线程将数据写入此队列:_logMessages.Add(newLogMessage("foo.log","thisisatest"));你启动了一个长时间运行的后台任务,它除了服务队列外什么都不做。文本);这里的潜在风险是线程创建消息的速度太快,导致队列无限增长,因为消费者跟不上。这是否是您应用程序中的真正风险,只有您可以说。如果您认为这可能有风险,您可以在队列上设置最大大小(条目数),这样如果队列大小超过该值,生成器将等到队列中有空间后再添加。您还可以使用ReaderWriterLock,这被认为是在处理读写操作时控制线程安全的一种更“正确”的方式...为了调试我的Web应用程序(当远程调试失败时),我使用以下('debug.txt'最终在服务器上的bin文件夹中):publicstaticclassLoggingExtensions{staticReaderWriterLocklocker=newReaderWriterLock();publicstaticvoidWriteDebug(stringtext){try{locker.AcquireWriterLock(int.MaxValue);System.IO.File.AppendAllLines(Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\",""),"debug.txt"),新[]{文本});}最后{locker.ReleaseWriterLock();}}}希望这可以节省你一些时间。以上就是C#学习教程:以线程安全的方式编写文件共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
