ChannelFactory очистка данных

139
06 марта 2018, 01:17

При передаче большого объема данных в WCF службу, передаваемое приложение начинает безмерно потреблять ОЗУ 240>364>478>797 Мб и т.д. Попытка очистить больше не используемую память не удалась.

Что пробовал:

  1. Очистка потока StringWriter Stream

  2. Очистка переменных типов XmlSerializer и FileStream

  3. GC.SuppressFinalize(this) и GC.Collect();

  4. Закрытие канала

Как еще можно очистить ОЗУ после передачи данных WCF сервису.

public static object LockSendDataSoftwareForPC = new object();
    public void SendDataSoftwareForPC(string ParameterType, string ParameterRequest) // Выполняет передачу данных
    {
        lock (LockSendDataSoftwareForPC)
        {
            string Result = "";
            string FileName = "";
            ASAM_Administrator.SoftwareForPC.BasicMethods GetDataForLeftPanel = new ASAM_Administrator.SoftwareForPC.BasicMethods(null);
            int _iNdex = MainForm.ValueSoftwareForPC.SelectedTab;
            int _iRows = GetDataForLeftPanel.GetIndexInListDataTabControl(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].NameTabControl);
            if (ParameterRequest != "")
            {
                try
                {
                    IWCFService WCFClientOpen = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].Channel.CreateChannel();
                    if (ParameterType == "SendDescriptionSettingPC")
                    {
                        ExecFile SetData = new ExecFile();
                        XmlSerializer XmlData = new XmlSerializer(typeof(ExecFile));
                        SetData.Description = ParameterRequest;
                        SetData.AnyFileName = Path.GetFileName(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].MainDataTab[_iRows].ExecutionFile);
                        using (StringWriter Stream = new StringWriter())
                        {
                            XmlData.Serialize(Stream, SetData);
                            Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                            Stream.Close();
                            Stream.Dispose();
                            if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                            {
                                throw new Exception(Result);
                            }
                            Result = null;
                        }
                    }
                    if (ParameterType == "SendFileSettingPC")
                    {
                        int CountFile = 0;
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].TotalLengh = 100;
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent = 0;
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 0;
                        foreach (string _File in MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.
                            PathFilesLocalFolder)
                        {
                            CountFile++;
                            if (File.Exists(_File))
                            {
                                using (FileStream CurrentFile = new FileStream(_File, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                                {
                                    ExecFile SerializableExecFile = new ExecFile();
                                    XmlSerializer XmlData = new XmlSerializer(typeof(ExecFile));
                                    int RemainingSize = (int)CurrentFile.Length;
                                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent = (100.00 / (CurrentFile.Length / 1000000));
                                    if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent >= 100)
                                    {
                                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                                    }
                                    int CountCell = 0;
                                    int _Offset = 0;
                                    if (RemainingSize < 1000000)
                                    {
                                        while ((CountCell = CurrentFile.Read(SerializableExecFile.File, _Offset, RemainingSize - _Offset)) > 0)
                                        {
                                            _Offset += CountCell;  // опеределяем необходимое количество строк в байтовом массиве путем смещения 
                                        }
                                        CurrentFile.Close();
                                        CurrentFile.Dispose();
                                        //FileName = Path.GetFileName(_File);
                                        FileName = ASAM_Administrator.SoftwareForPC.BasicMethods.CreatePathRemorePC(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].
                                        AddNewProgramAndRule.PathLocalDirectory, _File);
                                        SerializableExecFile.AnyFileName = FileName;
                                        SerializableExecFile.OffSet = _Offset;
                                        SerializableExecFile.Name = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].
                                        AddNewProgramAndRule.TitleColumns;
                                        SerializableExecFile.DirectoryWrite = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].
                                        AddNewProgramAndRule.PathRemoteFolder;
                                        if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].
                                                AddNewProgramAndRule.PathFilesLocalFolder.Count() == CountFile) // выбор исполняемого файла
                                        {
                                            SerializableExecFile.ExecFileName = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].
                                                 AddNewProgramAndRule.TitleColumns;
                                        }
                                        using (StringWriter Stream = new StringWriter())
                                        {
                                            XmlData.Serialize(Stream, SerializableExecFile);
                                            Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                                            Stream.Close();
                                            Stream.Dispose();
                                            if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                                            {
                                                throw new Exception(Result);
                                            }
                                            Result = null;
                                        }
                                        SerializableExecFile = null;
                                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                                        GC.Collect();
                                    }
                                    if (RemainingSize > 1000000)
                                    {
                                        int CopiedSize = 0;
                                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte = new byte[RemainingSize];
                                        while ((CountCell = CurrentFile.Read(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte, _Offset, RemainingSize - _Offset)) > 0)
                                        {
                                            _Offset += CountCell;  // опеределяем необходимое количество строк в байтовом массиве путем смещения 
                                        }
                                        CurrentFile.Close();
                                        CurrentFile.Dispose();
                                        SerializableExecFile.SizeFile = RemainingSize;
                                        do
                                        {
                                                if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusUpload == "Stop")
                                                {
                                                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                                                    SerializableExecFile.StatusWrite = -1;
                                                    using (StringWriter Stream = new StringWriter())
                                                    {
                                                        XmlData.Serialize(Stream, SerializableExecFile);
                                                        Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                                                        Stream.Close();
                                                        Stream.Dispose();
                                                        if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                                                        {
                                                            throw new Exception(Result);
                                                        }
                                                        Result = null;
                                                    }
                                                    break;
                                                }
                                            if (RemainingSize > 1000000)
                                            {
                                                if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite == 1)
                                                {
                                                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite = 2;
                                                }
                                                Array.ConstrainedCopy(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte, CopiedSize, SerializableExecFile.File, 0, 1000000);
                                                CopiedSize = CopiedSize + 1000000;
                                                FileName = ASAM_Administrator.SoftwareForPC.BasicMethods.CreatePathRemorePC(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathLocalDirectory, _File);
                                                SerializableExecFile.AnyFileName = FileName;
                                                SerializableExecFile.OffSet = CopiedSize;
                                                SerializableExecFile.Name = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                                SerializableExecFile.StatusWrite = 1;
                                                SerializableExecFile.DirectoryWrite = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathRemoteFolder;
                                                if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathFilesLocalFolder.Count() == CountFile) // выбор исполняемого файла
                                                {
                                                    SerializableExecFile.ExecFileName = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                                }
                                                using (StringWriter Stream = new StringWriter())
                                                {
                                                    XmlData.Serialize(Stream, SerializableExecFile);
                                                    Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                                                    Stream.Close();
                                                    Stream.Dispose();
                                                    if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                                                    {
                                                        throw new Exception(Result);
                                                    }
                                                    Result = null;
                                                }
                                                MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite = 1;
                                                MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = MainForm.ValueSoftwareForPC.
                                                    ListDataTabControl[_iNdex].PercentUpload + MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent;
                                                GC.SuppressFinalize(this);
                                                GC.SuppressFinalize(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].Channel);
                                                XmlData = new XmlSerializer(typeof(ExecFile));
                                            }
                                            else if (RemainingSize < 1000000)
                                            {
                                                MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                                                int BufLenhg = 0;
                                                if (RemainingSize == 0)
                                                {
                                                    Array.ConstrainedCopy(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte, CopiedSize, SerializableExecFile.File, 0, 1000000);
                                                    CopiedSize = CopiedSize + 1000000;
                                                }
                                                if (RemainingSize < 0)
                                                {
                                                    BufLenhg = RemainingSize + 1000000;
                                                    Array.ConstrainedCopy(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte, CopiedSize, SerializableExecFile.File, 0, BufLenhg);
                                                    CopiedSize = CopiedSize + BufLenhg;
                                                    SerializableExecFile.LastSize = BufLenhg;
                                                }
                                                if (RemainingSize > 0)
                                                {
                                                    Array.ConstrainedCopy(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte, CopiedSize, SerializableExecFile.File, 0, RemainingSize);
                                                    CopiedSize = RemainingSize;
                                                }
                                                FileName = ASAM_Administrator.SoftwareForPC.BasicMethods.CreatePathRemorePC(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathLocalDirectory, _File);
                                                SerializableExecFile.AnyFileName = FileName;
                                                SerializableExecFile.OffSet = CopiedSize;
                                                SerializableExecFile.StatusWrite = 2;
                                                SerializableExecFile.Name = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                                SerializableExecFile.DirectoryWrite = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathRemoteFolder;
                                                if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathFilesLocalFolder.Count() == CountFile) // выбор исполняемого файла
                                                {
                                                    SerializableExecFile.ExecFileName = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                                }
                                                if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite == 2)
                                                {
                                                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite = 3;
                                                }
                                                using (StringWriter Stream = new StringWriter())
                                                {
                                                    XmlData.Serialize(Stream, SerializableExecFile);
                                                    Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                                                    Stream.Close();
                                                    Stream.Dispose();
                                                    if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                                                    {
                                                        throw new Exception(Result);
                                                    }
                                                    Result = null;
                                                }
                                                GC.SuppressFinalize(this);
                                                GC.SuppressFinalize(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].Channel);
                                                XmlData = new XmlSerializer(typeof(ExecFile));
                                            }
                                            RemainingSize = RemainingSize - 1000000;
                                        }
                                        while (RemainingSize > 0);
                                        SerializableExecFile = null;
                                        GC.Collect();
                                    }
                                    if (RemainingSize == 1000000)
                                    {
                                        while ((CountCell = CurrentFile.Read(SerializableExecFile.File, _Offset, RemainingSize - _Offset)) > 0)
                                        {
                                            _Offset += CountCell;  // опеределяем необходимое количество строк в байтовом массиве путем смещения 
                                        }
                                        CurrentFile.Close();
                                        CurrentFile.Dispose();
                                        FileName = ASAM_Administrator.SoftwareForPC.BasicMethods.CreatePathRemorePC(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathLocalDirectory, _File);
                                        SerializableExecFile.AnyFileName = FileName;
                                        SerializableExecFile.OffSet = _Offset;
                                        SerializableExecFile.Name = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                        SerializableExecFile.DirectoryWrite = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathRemoteFolder;
                                        if (MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.PathFilesLocalFolder.Count() == CountFile) // выбор исполняемого файла
                                        {
                                            SerializableExecFile.ExecFileName = MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].AddNewProgramAndRule.TitleColumns;
                                        }
                                        using (StringWriter Stream = new StringWriter())
                                        {
                                            XmlData.Serialize(Stream, SerializableExecFile);
                                            Result = WCFClientOpen.MainMethodsInternal(ParameterType, Stream.ToString());
                                            Stream.Close();
                                            Stream.Dispose();
                                            if (Result != "CreateFile" && Result != "WriteFile" && Result != "SaveTXT")
                                            {
                                                throw new Exception(Result);
                                            }
                                            Result = null;
                                        }
                                        SerializableExecFile = null;
                                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                                    }
                                    //MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = MainForm.ValueSoftwareForPC.
                                    //    ListDataTabControl[_iNdex].PercentUpload + Convert.ToInt32(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent);
                                }
                            }
                        }
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte = new byte[1];
                        MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite = 0;
                        GC.SuppressFinalize(this);
                        GC.SuppressFinalize(MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].Channel);
                    }
                    GC.Collect();
                }
                catch (Exception Error)
                {
                    MainForm.EventloggingError = Error.ToString();
                    ConfigurationsPrograms.Message.MessageInformation("Core", "SendingFilesOnWCF", Error.ToString());
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte = null;
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StepPercent = 100;
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].PercentUpload = 100;
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].TotalLengh = 0;
                    //MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].CycleUpload = 0;
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].StatusWrite = 0;
                    MainForm.ValueSoftwareForPC.ListDataTabControl[_iNdex].FileByte = new byte[1];
                    GC.Collect();
                }
            }
            else return;
        }
    }
READ ALSO
Обработка координат

Обработка координат

Я хочу запускать скрипт, когда мой объект в юнити, допустим, преодолеет 47f по координате "y" в 2д пространстве

144
SharpPcap проблема с размером пакета

SharpPcap проблема с размером пакета

Сразу начну с сути проблемы, я хочу отправить на устройство echo пакет и при создании пакета размером больше, чем 255, выдает ошибку

145
Проблема с открытием сетевой папки

Проблема с открытием сетевой папки

Добрый деньНужен совет, потому что я не понимаю в какую сторону копать для решения проблемы

171
Передать На вторую форму значение label

Передать На вторую форму значение label

При нажатии на ячейку открывается новая форма, где должен отобразиться текст label:

167