Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减少此c#文件传输中的内存使用?_C#_File_Memory_Allocation_Transfer - Fatal编程技术网

如何减少此c#文件传输中的内存使用?

如何减少此c#文件传输中的内存使用?,c#,file,memory,allocation,transfer,C#,File,Memory,Allocation,Transfer,我有一个用c#编写的简单文件传输应用程序,使用TCP发送数据 这是我发送文件的方式: Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] fileName = Encoding.UTF8.GetBytes(fName); //file name byte[] fileData = new byte[100

我有一个用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;

            } 
        }            

    }
Socket clientSock=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
byte[]fileName=Encoding.UTF8.GetBytes(fName)//文件名
字节[]文件数据=新字节[1000*1024];
byte[]fileNameLen=位转换器.GetBytes(fileName.Length)//文件名的长度
FileStream fs=新的FileStream(textBox1.Text,FileMode.Open);
尝试
{
clientData=新字节[4+fileName.Length];
}
捕获(OutOfMemoryException exc)
{
MessageBox.Show(“内存不足”);
返回;
}
fileNameLen.CopyTo(clientData,0);
fileName.CopyTo(clientData,4);
clientSock.Connect(“172.16.12.91”,9050);
发送(clientData,0,clientData.Length,SocketFlags.None);
最大值=(int)fs.Length;
while(true)
{
int指数=0;
while(索引fs.Length)
{
progressBar1.Value+=((int)fs.Length-progressBar1.Value);
}
其他的
progressBar1.值+=(1024*1000);
}
if(index!=fileData.Length)
{
progressBar1.值=0;
clientSock.Close();
fs.Close();
打破
} 
}            
}
在taskmanager中,当我使用OpenFileDialog时,该应用程序的发布版本的内存使用量会增加13 MB,然后当它发送数据并停留在那里时,内存使用量会增加到16 MB。我能做些什么来减少内存使用吗?或者有没有一个好的工具可以用来监控应用程序中的总分配内存


当我们在那里的时候,16MB真的有那么高吗?

16MB的内存使用量听起来并没有那么大。 您可以使用内置的VisualStudio探查器来查看性能成本最高的是什么。有关探查器的更多信息,请参见下面的链接:
16MB的内存使用量听起来并没有那么大。 您可以使用内置的VisualStudio探查器来查看性能成本最高的是什么。有关探查器的更多信息,请参见下面的链接:

我注意到,当我最小化任何应用程序时,内存使用量会显著下降。我最终找到了一种通过编程复制这种效果的方法,我发现:

[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的内存。

我注意到,当我最小化任何应用程序时,内存使用量会显著下降。我最终找到了一种通过编程复制这种效果的方法,我发现:

[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的内存。

16MB并没有那么高。为什么要减少内存占用?有必要吗?这似乎是一个过早的优化。16MB没有那么高。为什么要减少内存占用?有必要吗?这似乎是一个过早的优化。我能问一下为什么吗?我不熟悉这一点,因为您现在引入了不必要的对象集合,所以您永远不想强制系统使用GC。应该允许垃圾回收器在需要时进行GC操作。通过强制执行,您不仅会影响应用程序的性能,还会影响其运行的系统的性能。让运行时做它自己的事情,并在它认为合适的时候让它做。编辑:我不鼓励使用这种方法(除非你确实需要它做什么),因为它根本不会“减少”内存。我能问为什么吗?我不熟悉这一点,因为您现在引入了不必要的对象集合,所以您永远不想强制系统使用GC。应该允许垃圾回收器在需要时进行GC操作。通过强制执行,您不仅会影响应用程序的性能,还会影响其运行的系统的性能。让运行时做它自己的事情,并在它认为合适的时候让它做。编辑:我不鼓励使用这种方法(除非你需要它做什么),因为它根本不会“减少”内存。