none
Threads, Delegate ou Tasks? RRS feed

  • Pergunta

  • Tenho esse programa. Preciso colocar o método execute  em uma Thread, task ou Delegate, ou seja, esse método rodará em um serviço e será startado automaticamente em um servidor e terei muitas execuções concorrentes, logo isso deveria ser feito em um desses caras acima. Abaixo todo meu código até agora.

    PesquisaAgenda pag = new PesquisaAgenda();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            Lista<Entity.Rotina> listaRotina = new Lista<Entity.Rotina>();
            Lista<Entity.Tarefa> listaTarefa = new Lista<Entity.Tarefa>();
            Lista<Entity.ExportacaoAgendamento> listaAgendamento = new Lista<Entity.ExportacaoAgendamento>();
            Lista<Entity.ExportacaoAgendamento> listaTudo = new Lista<Entity.ExportacaoAgendamento>();
    
            List<Int64> tarefa;
    
            Int64 _execTarefa;
            DateTime _diaHoraExcecucao = DateTime.Now;
    
            t.Timer timer = new t.Timer();
    
            private static int CompararTarefas(Entity.Tarefa tarefaDe, Entity.Tarefa tarefaPara)
            {
                return tarefaDe.OrdemExecucao.CompareTo(tarefaPara.OrdemExecucao);
            }
    
            private void BuscaTarefa()
            {
                if (listaTudo.Count == 0)
                {
                    listaTudo = Sistema.Infrastructure.Repository.ExportacaoAgendamento.RetornarTodos();
                }
    
                listaRotina = Sistema.Infrastructure.Repository.Rotina.RetornarTodos();
    
                dgvAgenda.DataSource = listaTudo.ToArray();
                dgvRotina.DataSource = listaRotina.ToArray();
    
                foreach (var item in listaRotina)
                {
                    if (item.DataInicial < DateTime.Now)
                    {
                        listaRotina = Sistema.Infrastructure.Repository.Rotina.RetornarPorFiltro(new Finder.Rotina() { IdRotina = item.IdRotina });
                        foreach (var item_rotina in listaRotina)
                        {
                            execute(item_rotina.IdRotina);
                        }
                    }
                }
            }
    
            private void execute(Int64 _rotina)
            { 
                var lista = Sistema.Infrastructure.Repository.Tarefa.RetornarPorFiltro(new Finder.Tarefa() { IdRotina = _rotina }).ToList();
                lista.Sort(CompararTarefas);
    
                foreach (var item in lista)
                {
                    string path = "";
                    path = item.Descricao;
                    System.Diagnostics.Process.Start(path);
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                BuscaTarefa();
            }

    sexta-feira, 24 de agosto de 2012 17:46

Todas as Respostas

  • Threads com delegates acho a melhor opção, embora tu tenha que tentar criar uma lógica para não gerar dead locks e não influenciar nas threads do windows para não gerar erros de cross threads...

    é meio complicado mas existem muitas opções para se trabalhar com isso, utilizando as classes monitor, threadpool... é só dar uma procurada aqui no msdn que tem material sobrando hehe...

    sexta-feira, 24 de agosto de 2012 18:59