C#如何同时读写表单文件?我创建了多个服务器。每个服务器都必须向自己的客户端发送一些数据。我正在使用TCP/IP协议。为了防止由于客户端断开而导致数据丢失,我使用了一个文本文件作为缓冲区。所以在程序中,每个服务器都有一个线程,不断检查客户端是否连接。如果已连接,它会从缓冲区中读取并将其发送给客户端。每当必须向客户端发送一些新数据时,我首先检查客户端是否已连接。如果客户端未连接,那么我将数据写入同一个缓冲区文本文件。我面临的问题是当线程正在从文件中读取文件时我无法写入文件。使用系统;使用System.Collections.Generic;使用System.IO;使用System.Linq;使用System.Net;使用System.Net.NetworkInformation;使用System.Net.Sockets;使用系统文本;使用系统线程;使用System.Threading.Tasks;namespaceWindowsFormsApplication1{publicclassTcpIp{publicintmachinePort;公共静态int端口1=1024;公共静态整数计数=0;公共字符串缓冲区名称;文件流缓冲区;套接字客户端;公共IP地址localIp;公共TcpListener发件人;StreamReader阅读器;文件流iStream;//this.getpublicTcpIp(stringid){this.machinePort=port1+count;while(!isAvailable(this.machinePort)){count++;this.machinePort=端口1+计数;}this.bufferName=WindowsFormsApplication1.Program.path+"machine_"+id+".txt";buffer=newFileStream(this.bufferName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);localIp=IPAddress.Parse(WindowsFormsApplication1.Program.ip);发件人=newTcpListener(localIp,this.machinePort);//this.oStream=newFileStream(this.bufferName,FileMode.Append,FileAccess.Write,FileShare.ReadWrite);//this.iStream=newFileStream(this.bufferName,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);//reader=newStreamReader(this.iStream);}boolisAvailable(intport){boolisAvailable=true;IPGlobalPropertiesipGlobalProperties=IPGlobalProperties.GetIPGlobalProperties();TcpConnectionInformation[]tcpConnInfoArray=ipGlobalProperties.GetActiveTcpConnections();foreach(tcpConnInfoArray中的TcpConnectionInformationtcpi){如果(tcpi.LocalEndPoint.Port==端口){isAvailable=false;休息;}}返回可用;}publicvoidcreateServer(){this.sender.Start();弦线;reader=newStreamReader(缓冲区);//client=sender.AcceptSocket();while(true){line=reader.ReadLine();如果(!connected()){client=sender.AcceptSocket();}while(reader.EndOfStream&&line!=null){byte[]bytes=System.Text.Encoding.UTF8.GetBytes(line);client.Send(bytes,0,bytes.Length,SocketFlags.None);line=reader.ReadLine();}//iStream.Flush();线程.睡眠(3000);//reader=newStreamReader(iStream);}}publicvoidwriteToClient(stringdata){if(connected()){//向客户端发送数据byte[]bytes=System.Text.Encoding.UTF8.GetBytes(data);//System.Buffer.BlockCopy(data.ToCharArray(),0,bytes,0,bytes.Length);this.client.Send(bytes,0,bytes.Length,SocketFlags.None);}else{//写入文件while(true){try{StreamWritersw=File.AppendText(this.bufferName);sw.WriteLine(数据);sw.Close();休息;}catch(Exceptionex){Console.WriteLine("WaitForFile{0}未能获得独占锁:"+ex.Message);//等待锁被释放System.Threading.Thread.Sleep(500);}}}}boolconnected(){if(client==null)returnfalse;否则返回client.Connected;}}}任何启示都将不胜感激谢谢:)实际问题是您混合了对文件的访问权限。您可以通过buffer=newFileStream(this.bufferName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);打开流buffer=newFileStream(this.bufferName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);从打开的流中创建一个StreamReader以供以后读取readreader=newStreamReader(buffer);.OTOH,您想通过StreamWritersw=File.AppendText(this.bufferName);让StreamWriter写入文件这将尝试再次打开文件,但由于文件共享模式不匹配而失败。因此,您需要通过完全相同的“句柄”(此处为FileStream)访问文件以进行写入和读取。另外,不要忘记通过某种锁定机制对访问进行序列化,以使其成为线程安全的。否则,您将收到损坏的数据。您可能需要维护读/写指针(Stream.Position)。您不能同时读取和写入同一个文本文件。如果你真的要使用文本文件,为什么不使用其中的两个:一个用于读取,一个用于读写。一旦读取文件为空->读取文件是新的写入文件,反之亦然。这听起来合乎逻辑,因为文件正在使用中,不可能有2个线程同时访问该文件。想象一下,即使有可能,您也会有一些非常奇怪的行为。为什么不使用lock()来确保在给定时间只有一个线程可以访问该文件?使用异步编程,你不需要等到锁被释放后才能继续执行程序。你必须像这样创建线程Threadthread=newThread(yourMethod());当你有多个线程时,你需要的是ReaderWriterLockSlim。链接在这里。它允许您通过多个线程读取文件,但使用一个线程写入文件。我认为这会解决你的问题。以上就是C#学习教程:如何用C#同时读/写窗体文件?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
