Запустите блок таймера в фоновом режиме, когда приложение работает в C #

Я разрабатываю приложение на C # с Windows Form, если это поисковая система, к которой он подключается к базе данных, чтобы доставить данные и поместить их в DataGridView, но в этом приложении оно содержит menuStrip, где оно содержит три модуля. (каждый находится в форме) и получает информацию из файла Excel и отправляет ее в базу данных, он реализовал таймер, в котором время от времени проверяет файл, чтобы отправить его в базу данных. Мой вопрос как это сделать, когда приложение выполняется, модули также выполняются, так что он читает файл. Я знаю, что с помощью потоков я могу это сделать, но я не могу придумать способ сделать попытку, что вы порекомендуете?

Вот как я это делаю, этот код предназначен для поисковой системы, и именно здесь я помещаю поток, так что он начинает получать данные другой формы

public partial class Home : Form
{
    public Home()
    {
        InitializeComponent();
        Threat t = new Thread (timer1_Tick_1);
        t.start();

    }
    //Tipos de Busquedas INICIO
    private void fechaBusqueda(String pFecha = null)
    {
        using (Models.plcModSegPasoEntities db = new Models.plcModSegPasoEntities())
        {
            IQueryable<DatosGetSet> lst =
                from d in db.plcModulesValues
                select new DatosGetSet
                {
                    horaA = d.Hora,
                    fechaA = d.Fecha,
                    moduloA = d.Modulo,
                    operadorA = d.Operador,
                    codeLlantaA = d.CodeLlanta,
                    numLlantaA = d.NumLlanta,
                    codeBarraA = d.CodeBarra,
                    construcTimeA = d.ConstrucTime,
                    timeCicloA = d.CicloTime
                };
            // Casos de busqueda 1
            if (pFecha != null) 
                lst = lst.Where(d => d.fechaA == pFecha);
            dGVDatos.DataSource = lst.ToList();
        }
    }
    //Tipos de Busquedas FIN
    //Evento del boton buscador INICIO

    private void btnBuscar_Click(object sender, EventArgs e)
    {
        if (!txtFecha.Text.Trim().Equals("") && txtModulo.Text.Trim().Equals("") && txtOperador.Text.Trim().Equals("") && txtCodigoLlanta.Text.Trim().Equals(""))
            fechaBusqueda(txtFecha.Text.Trim());
        else
            MessageBox.Show("No se encontro ningún resultado con esa busqueda", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // es como lo de 1 en flyair
    }
    //Evento del boton buscador FIN
    //Menu Strip para que abra los modulos en ventanas separadas INICIO
    private void moduToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form mod1 = new Mod1();
        mod1.Show();
    }

    private void salirToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close();
    }
    //Menu Strip para que abra los modulos en ventanas separadas FIN
}

Это форма окна, которая читает из Excel и отправляет ее на bd, блок, который я делаю поток является timer1_Tick_1

public partial class Mod1 : Form
{
    public Mod1()
    {
        InitializeComponent();
    }

    //MisVariables
    DatosGetSet datos = new DatosGetSet();
    double modulo = 0, numLlanta = 0, timeConstruccion = 0, timeCiclo = 0;
    String operador = null, codigoLlanta = null, codigoBarras = null;
    String codBarAux = null, sqldate = null, sqltime = null;

    private void timer1_Tick_1(object sender, EventArgs e) //El timer desde aqui enpieza
    {
        try
        {
            //Create COM Objects. Create a COM object for everything that is referenced
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\N033321a\Desktop\modulos.xls");
            Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            Excel.Range xlRange = xlWorksheet.UsedRange;

            //Count of Raw and Columns in Excel
            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;

            //R,C ExtraigoLosValoresDeCadaCelda
            sqldate = DateTime.Now.ToString("d-MM-yyyy");
            sqltime = DateTime.Now.ToString("hh:mm");
            modulo = (xlRange.Cells[40, 2] as Excel.Range).Value;
            operador = (xlRange.Cells[40, 3] as Excel.Range).Value;
            codigoLlanta = (xlRange.Cells[40, 4] as Excel.Range).Value;
            numLlanta = (xlRange.Cells[40, 5] as Excel.Range).Value;
            codigoBarras = (xlRange.Cells[40, 6] as Excel.Range).Value;
            timeConstruccion = (xlRange.Cells[40, 7] as Excel.Range).Value;
            timeCiclo = (xlRange.Cells[40, 8] as Excel.Range).Value;

            //DeLasVariablesLasPongoEnLosTextbox
            txtFecha.Text = sqldate + " " + sqltime;
            datos.fechaA = sqldate;
            datos.horaA = sqltime;

            txtModulo.Text = modulo.ToString();
            datos.moduloA = modulo.ToString();

            txtOperador.Text = operador.ToString();
            datos.operadorA = operador.ToString();

            txtCodLlanta.Text = codigoLlanta.ToString();
            datos.codeLlantaA = codigoLlanta.ToString();

            txtNumLlanta.Text = numLlanta.ToString();
            datos.numLlantaA = numLlanta.ToString();

            txtCodBarras.Text = codigoBarras.ToString();
            datos.codeBarraA = codigoBarras.ToString();

            txtTiempoConstr.Text = timeConstruccion.ToString();
            datos.construcTimeA = timeConstruccion.ToString();

            txtTiempoCiclo.Text = timeCiclo.ToString();
            datos.timeCicloA = timeCiclo.ToString();

            //Condicion para que no envie llantas repetidas a la BD
            if (!codigoBarras.Equals(codBarAux))
            {
                codBarAux = codigoBarras.ToString();
                DatosDAL.Agregar(datos);
            }

            //cleanup
            GC.Collect();
            GC.WaitForPendingFinalizers();

            //rule of thumb for releasing com objects:
            //  never use two dots, all COM objects must be referenced and released individually
            //  ex: [somthing].[something].[something] is bad

            //release com objects to fully kill excel process from running in the background
            Marshal.ReleaseComObject(xlRange);
            Marshal.ReleaseComObject(xlWorksheet);

            //La linea salvadora  <3
            xlApp.DisplayAlerts = false;

            //close and release
            xlWorkbook.Close();
            Marshal.ReleaseComObject(xlWorkbook);

            //quit and release
            xlApp.Quit();
            Marshal.ReleaseComObject(xlApp);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Se produjo un error al leer el archivo de excel \n Error: " + ex.Message, "FATAL ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
0
задан 29.11.2019, 00:05
1 ответ

то, что я понимаю, состоит в том, что каждый раз, когда он меняет файл на Excel ты должен обновлять твою базу данных. Вместо того, чтобы использовать трэды или timers, ты recomendarГ, - чтобы использовать класс FileSystemWatcher , этот класс "слушает" изменения, реализованные в системе файлов и производит события, когда он меняет каталог или файл каталога. Таким образом, ты можешь сообщать себе, что файл изменился, и можешь читать это и обновлять твою базу данных. В ссылке есть пример, что ты podrГ, - чтобы осветлять тему. Я сделал что-то похожим, чтобы обнаруживать, что существовал новый файл в папке, и посылать это из-за FTP, что я думаю, что это задание, сходное с той, которая у тебя есть.

Пример mГЎs сходный ты это можешь видеть aquГ - . Эта pГЎgina не mГ - в я ни знаю автора.

0
ответ дан 01.12.2019, 10:44

Теги

Похожие вопросы