ranio Ответов: 1

Как зарегистрировать обработчик событий один раз и вызвать событие в C#?


Я делаю загрузку массовых файлов через sftp Rebex. Поскольку я получал исключение из памяти для большого объема файлов , обновлял код по мере необходимости, и проблема дублирования была исправлена путем регистрации и незарегистрированной обработки событий во время каждого процесса цикла. Я хочу зарегистрировать обработчик событий один раз и вызвать его без регистрации и отмены регистрации во время каждого цикла

Что я уже пробовал:

Основной код выглядит следующим образом:
private List<SFTPFile> ListInwardCBFiles()
  {
     _listSftp = new Sftp();
     SFTPFile objSFTPFile;
     List<SFTPFile> ListSFTPFile = new List<SFTPFile>();
     try
     {
         if (ConnectSftp(_listSftp))
         {
             foreach (InwardMessageType t in Enum.GetValues(typeof(InwardMessageType)))
             {

                 foreach (CBExtension r in Enum.GetValues(typeof(CBExtension)))
                 {
                 var listItemReceived = new SftpListItemReceivedEventHandler((s, e) =>
                      {
                          SftpItem item = e.Item;
                          objSFTPFile = new SFTPFile();
                          objSFTPFile.FileType = Enum.GetName(typeof(InwardMessageType), t);
                          objSFTPFile.Extension = Enum.GetName(typeof(CBExtension), r);
                          objSFTPFile.Status = SFTPStatus.L.ToString();
                          objSFTPFile.FileName = item.Name.Trim();
                          objSFTPFile.FileSize = item.Size;
                          objSFTPFile.Mode = SFTPMode.D.ToString();
                          objSFTPFile.BankCode = Common.BANKCODE;
                          ListSFTPFile.Add(objSFTPFile);
                          Common.WriteLog(MethodInfo.GetCurrentMethod().Name + " FileType: " + objSFTPFile.FileType + " FileName: " + objSFTPFile.FileName, ServiceThread.Listing.ToString());
                          e.Ignore();
                      });
                     _listSftp.ListItemReceived += listItemReceived;  //register
                     _listSftp.GetList(GetSFTPServerPath(Enum.GetName(typeof(InwardMessageType), t)) + "//" + "*." + Enum.GetName(typeof(CBExtension), r));
                     _listSftp.ListItemReceived -= listItemReceived; //unregister
                 }
             }

         }
     }
     catch (Exception ex)
     {
         Common.WriteLog("Exception while listing files in the folder " + Environment.NewLine + ex.Message, ServiceThread.Listing.ToString());

     }
     finally
     {
         DisConnectSftp(_listSftp);
     }

     return ListSFTPFile;
 }
 #endregion

1 Ответов

Рейтинг:
0

RickZeeland

Почему бы вам просто не использовать логический флаг, который определяет, есть ли код в вашем коде? listItemReceived() метод должен быть выполнен, тогда вам нужно только один раз зарегистрировать обработчик событий.


ranio

Даже если Boolean option установлен в listItemReceived (), как мы можем избежать дублирования, поскольку мы циклически проходим через каждый тип сообщения и их соответствующие типы расширений CB. Нужно перечислить файлы со всеми типами сообщений и типами расширений CB, присутствующими в каталоге.

ranio

Я зарегистрировал обработчик событий один раз, не отменяя регистрацию для каждого цикла цикла. Но я не могу перечислить файлы, так как он не может передать дополнительные параметры(внутренние типы сообщений и их соответствующие значения) обработчику событий SftpListItemReceivedEventHandler .

Код выглядит следующим образом:
#region ListInwardCBFiles
частный список<sftpfile> ListInwardCBFiles()
{
_listSftp = новый Sftp();
ObjSFTPFile SFTPFile ;
List<sftpfile> ListSFTPFile = новый список<sftpfile>();
пробовать
{
если (ConnectSftp(_listSftp))
{
objSFTPFile = новый SFTPFile();
по каждому элементу (InwardMessageType т в enum.GetValues(typeof на(InwardMessageType)))
{

foreach (CBExtension r в Enum.GetValues(typeof(CBExtension)))
{

_listSftp.ListItemReceived += client_ListItemReceived;//Регистрация
_listSftp.GetList(GetSFTPServerPath(перечисление.Метод getname(для вызова typeof(InwardMessageType), Т)) + "//" + "*." + Перечисление.GetName(typeof(CBExtension), r));

}
}

}
}
поймать (исключение бывший)
{
Общий.WriteLog("исключение при перечислении файлов в папке" + Environment.NewLine + ex.Message, ServiceThread.Перечисление.Метод toString());

}
наконец
{
DisConnectSftp(_listSftp);
}

возврат ListSFTPFile;
}
#endregion


client_ListItemReceived недействительным(объект отправителя, SftpListItemReceivedEventArgs е)
{

var listItemReceived = new SftpListItemReceivedEventHandler((s, e1) =>
{
Пункт SftpItem = Е1.Пункт;

objSFTPFile.FileType = Перечисление.GetName(typeof(InwardMessageType), t);
objSFTPFile.Расширение = Перечисление.GetName(typeof(CBExtension), r);
objSFTPFile.Статус = SFTPStatus.Л.Метод toString();
objSFTPFile.Имя файла = item.Name-да.Отделка();
objSFTPFile.Размер = товар.Размер;
objSFTPFile.Режим = SFTPMode.Д. Метод toString();
objSFTPFile.Банковский Код = Общий.BANKCODE;
ListSFTPFile.Добавить(objSFTPFile);
Общий.WriteLog(MethodInfo.GetCurrentMethod().Name + "FileType:" + objSFTPFile.Тип файла + "FileName:" + objSFTPFile.Имя Файла, ServiceThread.Перечисление.Метод toString());
Е1.Игнорировать();
});

_listSftp.ListItemReceived += client_ListItemReceived;//Регистрация
_listSftp.GetList(GetSFTPServerPath(перечисление.Метод getname(для вызова typeof(InwardMessageType), Т)) + "//" + "*." + Перечисление.GetName(typeof(CBExtension), r));

}
}

}
}

RickZeeland

Разве SFTPFile objSFTPFile; не должен быть определен на уровне класса ?