При передаче большого объема данных в WCF службу, передаваемое приложение начинает безмерно потреблять ОЗУ 240>364>478>797 Мб и т.д. Попытка очистить больше не используемую память не удалась.
Что пробовал:
Очистка потока StringWriter Stream
Очистка переменных типов XmlSerializer и FileStream
GC.SuppressFinalize(this) и GC.Collect();
Закрытие канала
Как еще можно очистить ОЗУ после передачи данных 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;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я хочу запускать скрипт, когда мой объект в юнити, допустим, преодолеет 47f по координате "y" в 2д пространстве
Сразу начну с сути проблемы, я хочу отправить на устройство echo пакет и при создании пакета размером больше, чем 255, выдает ошибку
Добрый деньНужен совет, потому что я не понимаю в какую сторону копать для решения проблемы
При нажатии на ячейку открывается новая форма, где должен отобразиться текст label: