如何注册事件处理程序一次并在C#中调用事件? [英] How to register event handler once and invoke the event in C#?

查看:85
本文介绍了如何注册事件处理程序一次并在C#中调用事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在通过sftp Rebex下载批量文件。由于我因大量文件而出现内存不足异常,因此根据需要更新了代码,并通过在每个循环过程中注册和取消注册事件处理来纠正所看到的重复问题。我想注册一次事件处理程序并在每次循环期间调用它而不注册和取消注册



我尝试过:



核心代码如下:

I am doing downloading of bulk files via sftp Rebex. Since I was getting out of memory exception for large volume of files , updated the code as required and duplication issue seen was rectified by registering and unregistered the event handling during each loop process. I want to to register event handler once and invoke the same without registering and unregistering during each loop

What I have tried:

Core Code is as below:

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

推荐答案

为什么不使用布尔标志确定是否需要执行 listItemReceived()方法中的代码,然后只需要注册一次事件处理程序。
Why don't you just use a Boolean flag that determines if the code in your listItemReceived() method needs to be executed, then you only need to register the event handler once.


这篇关于如何注册事件处理程序一次并在C#中调用事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆