【问题标题】:Launch Application within a Thread using a Timer使用计时器在线程内启动应用程序
【发布时间】:2009-12-29 18:41:01
【问题描述】:

我有一个线程,在这个线程中我调用了一个需要很长时间处理的方法。

该方法有一个foreach,每次迭代都使用一个计数器(counter++)

我想这样做:

  • foreach 内,如果计数器 > 20:
    • 检查是否有名称为“SendMailService.exe”的进程正在执行。
    • 如果未执行,请使用process.start(sendmailservice.exe); 启动
    • 如果执行等待 3 分钟再检查。
  • 在 foreach 代码之后
    • 检查是否有名称为“SendMailService.exe”的进程正在执行。
    • 如果进程正在执行,请等待进程完成。

有人能理解我吗?任何帮助将不胜感激。

我的代码是:

private void bEnviarAleatorioSeleccionados_Click(object sender, EventArgs e)
{
    CrossThreadCalls();

    this.bEnviarAleatorioSeleccionados.Enabled = false;

    // Threads werden erzeugt
    Thread hiloMain = new Thread(
        new ThreadStart(EnviarAleatorioSeleccionadosYEnviarCorreo));
    hiloMain.Start(); // Threads werden gestartet
}

private void EnviarAleatorioSeleccionadosYEnviarCorreo()
{
    string rutaFicheroMp3 = GetRutaFicheroMp3DeLoquendo(textoLoquendo);

    int contador = 0;
    foreach (ListViewItem item in lstRecientes.Items)
    {
        if (item.Checked)
        {
            contador++;
            EnviarCorreoParaElementoListView(item, rutaFicheroMp3, item.Text);
        }

        // DO THE CHECK HERE, EACH 3 MINUTES (TIMER) !!!! HOW ????????
        if (contador > 20)
        {
            var listaP = Process.GetProcesses().FirstOrDefault(
                p => p.ProcessName == "ServicioEnvioCorreo.exe");
            if (listaP == null)
            {
                // Iniciar Envio de Correo
                EnviarCorreosPorProceso();
            }
        }
    }

    EliminarFicheroLoquendo(rutaFicheroMp3);
    this.bEnviarAleatorioSeleccionados.Enabled = true;
}

【问题讨论】:

  • 你应该用你使用的语言来标记它。

标签: c# multithreading process timer


【解决方案1】:

嗯,有两件事:

因为无论如何您都是在单独的线程上执行此操作:

// DO THE CHECK HERE, EACH 3 MINUTES (TIMER) !!!! HOW ???????? 
if (contador > 20)  { ... }

您可以轻松地阻止线程进行 3 分钟检查,而不是使用计时器。一个简单的Thread.Sleep(180000); 将使您的循环延迟 3 分钟。

话虽如此,我怀疑这是否真的是解决这个问题的最佳方法。由于您自己启动进程,您可以将处理程序附加到Process.Exited 事件,并在进程退出后“重新启动”进程。这将消除对循环、检查甚至整个单独线程的全部需求。只需启动该进程,当它存在时,重新启动它 (20x)。

【讨论】:

  • 我想阻塞线程,使用 Thread.Sleep(180000);我将测试 Process.Exited,我会找到任何示例代码。谢谢先生。新年快乐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多