2011-04-18 56 views
0

我有一个简单的文件传输应用程序在C#编写的使用TCP发送数据。如何减少此c#文件传输中的内存使用量?

这是我如何发送文件:

Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 


     byte[] fileName = Encoding.UTF8.GetBytes(fName); //file name 
     byte[] fileData = new byte[1000*1024]; 
     byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //length of file name 
     FileStream fs = new FileStream(textBox1.Text, FileMode.Open);    
     try 
     { 
      clientData = new byte[4 + fileName.Length]; 
     } 
     catch (OutOfMemoryException exc) 
     { 
      MessageBox.Show("Out of memory"); 
      return; 
     } 

     fileNameLen.CopyTo(clientData, 0); 
     fileName.CopyTo(clientData, 4); 
     clientSock.Connect("172.16.12.91", 9050); 
     clientSock.Send(clientData, 0, clientData.Length, SocketFlags.None);      
     progressBar1.Maximum = (int)fs.Length; 
     while (true) 
     { 
      int index = 0; 
      while (index < fs.Length) 
      { 
       int bytesRead = fs.Read(fileData, index, fileData.Length - index); 
       if (bytesRead == 0) 
       { 
        break; 
       } 

       index += bytesRead; 
      } 
      if (index != 0) 
      { 
       clientSock.Send(fileData, index, SocketFlags.None); 
       if ((progressBar1.Value + (1024 * 1000)) > fs.Length) 
       { 
        progressBar1.Value += ((int)fs.Length - progressBar1.Value); 
       } 
       else 
        progressBar1.Value += (1024 * 1000); 
      } 

      if (index != fileData.Length) 
      { 
       progressBar1.Value = 0; 
       clientSock.Close(); 
       fs.Close(); 

       break; 

      } 
     }    

    } 

在任务管理器,该应用程序的内存使用情况的发布版本变为13 MB,当我用打开文件对话框,然后上升到16 MB时,它发出那么数据保持那里。有什么我可以做的,以减少内存使用量?还是有一个很好的工具可以用来监视应用中的总分配内存?

虽然我们在那里,16 MB真的很高吗?

+0

16MB并不是那么高。为什么你想减少内存占用?有什么需要吗?似乎是一个不成熟的优化。 – PVitt 2011-04-27 11:40:47

回答

0

我注意到,当我最小化任何应用程序时,内存使用情况都会显着下降。我终于找了一个以编程方式复制这种效果,这是我发现:

[DllImport("kernel32.dll")] 
     public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max); 
     public void ReleaseMemory() 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      if (Environment.OSVersion.Platform == PlatformID.Win32NT) 
      { 
       SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); 
      } 
     } 

我不知道缺点在使用此但到目前为止,它成功地节省内存至少为13MB。

+0

Yikes!不要打电话给GC! – 2011-04-28 02:00:03

+0

我可以问为什么?我是新来的 – Raphael 2011-04-28 05:32:50

+1

你永远不想强制系统进入GC,因为你现在正在引入不必要的对象集合。垃圾收集器应该被允许GC的东西,当它想要做到这一点。通过强制它,您不仅会影响您的应用程序的性能,还会影响其运行的系统。让运行时间做它的事情,并让它在它认为适当的时候这样做。 – 2011-04-29 02:33:43