private void ListarPapeisNegociadosBovespaBmf(object pStateTransaction)
        {
            try
            {
                PapelNegociadoBmfDbLib       lPapelBmfDb  = new PapelNegociadoBmfDbLib();
                List <PapelNegociadoBmfInfo> listPapelBmf = lPapelBmfDb.ListarPapelNegociadoBmf();

                PapelNegociadoBovespaDbLib       lPapelBovespaDb  = new PapelNegociadoBovespaDbLib();
                List <PapelNegociadoBovespaInfo> listPapelBovespa = lPapelBovespaDb.ListarPapelNegociadoBovespa();

                ListaPapeisNegociados = new Hashtable();
                ListaPapeisNegociados.Clear();

                lock (ListaPapeisNegociados)
                {
                    foreach (PapelNegociadoBovespaInfo item in listPapelBovespa)
                    {
                        if (!ListaPapeisNegociados.Contains(item.CodNegociacao.Trim()))
                        {
                            ListaPapeisNegociados.Add(item.CodNegociacao.Trim(), item);
                        }
                    }

                    foreach (PapelNegociadoBmfInfo item in listPapelBmf)
                    {
                        if (!ListaPapeisNegociados.Contains(string.Concat(item.CodMercadoria.Trim(), item.SerieVencimento.Trim())))
                        {
                            ListaPapeisNegociados.Add(string.Concat(item.CodMercadoria.Trim(), item.SerieVencimento.Trim()), item);
                        }
                    }

                    logger.Info(string.Concat("Entrou no ListarPapeisNegociadosBovespaBmf e listou ", ListaPapeisNegociados.Count, " papeis"));
                }

                ListaCadastroPapeisMDS = new Dictionary <string, CadastroPapelMdsInfo>();
                ListaCadastroPapeisMDS.Clear();

                lock (ListaCadastroPapeisMDS)
                {
                    CadastroPapeisMdsDbLib lCadastroPapeisMdsDb = new CadastroPapeisMdsDbLib();
                    lCadastroPapeisMdsDb._ConnectionStringName = ConnectionStringMDS;
                    ListaCadastroPapeisMDS = lCadastroPapeisMdsDb.ListarCadastroPapeisMDS();
                    logger.Info(string.Concat("Entrou no ListarCadastroPapeisMDS e listou ", ListaCadastroPapeisMDS.Count, " papeis"));

                    List <string> ListaComposicaoIndicesMDS = lCadastroPapeisMdsDb.ListarComposicaoIndicesMDS();
                    logger.Info(string.Concat("Entrou no ListarComposicaoIndicesMDS e listou ", ListaComposicaoIndicesMDS.Count, " papeis"));

                    foreach (string item in ListaComposicaoIndicesMDS)
                    {
                        string[] composicaoIndice = item.Split('@');
                        string   indice           = composicaoIndice[0];
                        string   instrumento      = composicaoIndice[1];

                        if (ListaCadastroPapeisMDS.ContainsKey(instrumento))
                        {
                            CadastroPapelMdsInfo dadosInstrumento = ListaCadastroPapeisMDS[instrumento];
                            dadosInstrumento.ComposicaoIndice  += indice + ",";
                            ListaCadastroPapeisMDS[instrumento] = dadosInstrumento;
                        }
                        else
                        {
                            logger.Error("Ops, nao ha instrumento [" + instrumento + "] na ListaCadastroPapeisMDS, erro na composicao de Indice");
                        }
                    }
                    logger.Info("Composição dos Indices atualizado");
                }
            }
            catch (Exception ex)
            {
                logger.Error(pStateTransaction, ex);
            }
        }
        /// <summary>
        /// Retorna uma lista de todos os papeis cadastrados do MDS
        /// </summary>
        /// <returns></returns>
        public Dictionary <string, CadastroPapelMdsInfo> ListarCadastroPapeisMDS()
        {
            SqlConnection conn      = null;
            String        procedure = "prc_lst_tbCadastroPapel";

            logger.Debug("Preparando Solicitacao " + procedure);

            Dictionary <string, CadastroPapelMdsInfo> ret = new Dictionary <string, CadastroPapelMdsInfo>();
            SqlCommand command = new SqlCommand();

            try
            {
                conn = new SqlConnection(_ConnectionStringName);
                conn.Open();

                command.Connection  = conn;
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = procedure;

                DataTable dtDados      = new DataTable();
                DateTime  dataRegistro = DateTime.Now;

                // Obter todos os instrumentos atualizados de até 5 dias atrás, e não apenas da data atual
                dataRegistro = dataRegistro.AddDays(-5);

                do
                {
                    command.Parameters.AddWithValue("@DataRegistro", dataRegistro);

                    SqlDataAdapter da = new SqlDataAdapter(command);
                    da.Fill(dtDados);

                    if (dtDados.Rows.Count == 0)
                    {
                        command.Parameters.RemoveAt("@DataRegistro");
                        dataRegistro = dataRegistro.AddDays(-1);
                    }
                }while (dtDados.Rows.Count == 0);

                foreach (DataRow registro in dtDados.Rows)
                {
                    CadastroPapelMdsInfo info = new CadastroPapelMdsInfo();
                    info.Instrumento              = registro["CodigoInstrumento"].ToString();
                    info.RazaoSocial              = registro["RazaoSocial"].ToString();
                    info.GrupoCotacao             = registro["GrupoCotacao"].ToString();
                    info.FormaCotacao             = (registro["FormaCotacao"].ToString().Equals("") ? 0 : Convert.ToInt32(registro["FormaCotacao"].ToString()));
                    info.DataUltimoNegocio        = (registro["DataUltimoNegocio"].ToString().Equals("") ? DateTime.MinValue : Convert.ToDateTime(registro["DataUltimoNegocio"].ToString()));
                    info.LotePadrao               = (registro["LotePadrao"].ToString().Equals("") ? 0 : Convert.ToInt32(registro["LotePadrao"].ToString()));
                    info.IndicadorOpcao           = registro["IndicadorOpcao"].ToString();
                    info.PrecoExercicio           = (registro["PrecoExercicio"].ToString().Equals("") ? 0 : Convert.ToDouble(registro["PrecoExercicio"].ToString()));
                    info.DataVencimento           = (registro["DataVencimento"].ToString().Equals("") ? DateTime.MinValue : Convert.ToDateTime(registro["DataVencimento"].ToString()));
                    info.CodigoPapelObjeto        = registro["CodigoPapelObjeto"].ToString();
                    info.SegmentoMercado          = registro["SegmentoMercado"].ToString();
                    info.CoeficienteMultiplicacao = (registro["CoeficienteMultiplicacao"].ToString().Equals("") ? 0 : Convert.ToDouble(registro["CoeficienteMultiplicacao"].ToString()));
                    info.DataRegistro             = (registro["DataRegistro"].ToString().Equals("") ? DateTime.MinValue : Convert.ToDateTime(registro["DataRegistro"].ToString()));
                    info.CodigoISIN               = registro["CodigoISIN"].ToString();

                    ret.Add(info.Instrumento, info);
                }
            }
            catch (Exception e)
            {
                logger.Error("Erro procedure[" + procedure + "] Mensagem: [" + e.Message + "]", e);
            }
            finally
            {
                conn.Close();
                conn.Dispose();

                command.Connection.Close();
                command.Dispose();
                command = null;
            }
            logger.Debug("Preparando Resposta " + procedure + " qtdItens[" + ret.Count + "]");
            return(ret);
        }