我有一个用c#编写的简单的文件传输应用程序,使用TCP发送数据。
我是这样发送文件的:
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;
}
}
}
在任务管理器中,当我使用OpenFileDialog时,这个应用程序的发布版本的内存使用量为13 MB,然后在发送数据时达到16 MB,然后停留在那里。我能做些什么来减少内存的使用吗?或者有一个很好的工具,我可以用它来监控应用程序中的总分配内存?
既然我们在那里,16mb真的那么高吗?
16MB听起来并不是很大的内存使用量。您可以使用内置的visual studio分析器来查看哪些性能消耗最大。有关该分析器的更多信息,请参阅下面的链接:http://blogs.msdn.com/b/profiler/archive/2009/06/10/write -更快的代码——- vs - 2010 profiler.aspx
我注意到,当我最小化任何应用程序时,内存使用都会显著下降。我最终寻找了一种方法来通过编程复制这种效果,这就是我发现的:
[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的内存。