【问题标题】:2 loops at the same time in c# console application在 C# 控制台应用程序中同时进行 2 个循环
【发布时间】:2017-05-10 13:57:13
【问题描述】:

我正在制作一个项目,它将使应用程序运行数小时,每 2 分钟检查一次值。问题是我有两个时间来检查两个不同的值。

while (Variaveis_importadas[varfossaalarme] != Convert.ToInt32(situacao[3]))
{                
    Thread.Sleep(60000);                
    while (!ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Erro na função ClientGetVARs. Não foi possivel receber os dados.");
        Thread.Sleep(2000);
        Console.Clear();
    }

    if (ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Os dados foram recebidos.");
    }
    Thread.Sleep(2000);
    Console.Clear();                
}

while (Variaveis_importadas[varst04] >= Convert.ToInt32(situacao[7]))
{
    Thread.Sleep(60000);
    while (!ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Erro na função ClientGetVARs. Não foi possivel receber os dados.");
        Thread.Sleep(2000);
        Console.Clear();
    }
    if (ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Os dados foram recebidos.");
    }
    Thread.Sleep(2000);
    Console.Clear();
}

我想知道他们会以这种方式同时执行,还是需要一些其他功能才能同时执行。

我已经看到一个名为 BackgroundWorker 的类,但它只讨论了 Windows 窗体应用程序而不是控制台应用程序。

【问题讨论】:

  • 不,您的第一个循环将执行,然后是您的第二个循环。您可以查看计时器或线程以同时运行这两个部分,或者您可以只有 one 循环每分钟检查两个部分。 (你说每两分钟检查一次,但你的主 Thread.Sleep 是一分钟。)
  • 我会说你可以使用线程。
  • BackgroundWorker 用于并行运行代码。它在图形界面中很常见,因此界面看起来是响应式的(一个线程中的进度条,另一个线程中的实际工作),尽管它绝对不是必需的(即它在控制台中工作)
  • 查看 await Task.Delay() 而不是 Thread.Sleep(); 以避免阻塞线程
  • @JGH 这对控制台应用程序没有多大帮助......或者顺序运行两个 while 循环。 await 只会让初学者的代码更加复杂...

标签: c# loops while-loop console-application


【解决方案1】:

您可以使用计时器或同时检查两个值。

      while (Variaveis_importadas[varfossaalarme] != 
  Convert.ToInt32(situacao[3]) ||  Variaveis_importadas[varst04] >= 
  Convert.ToInt32(situacao[7]))
   {                
Thread.Sleep(60000);                
while (!ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
{
    Console.WriteLine("Erro na função ClientGetVARs. Não foi possivel receber os dados.");
    Thread.Sleep(2000);
    Console.Clear();
}

if (ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
{
    Console.WriteLine("Os dados foram recebidos.");
}
Thread.Sleep(2000);
Console.Clear();                
   }

【讨论】:

  • “||”是不是和“OR”一样?
  • 是的。相同的或。因此,如果满足其中任何一个条件,您就会得到输出。
  • 我可以看到您正在检查这两个条件,如果为真,您将获得相同的输出。那么为什么不把它们放在一个条件下呢。 :)
  • 不客气。如果您觉得我的回答有帮助,请评价它。
【解决方案2】:

您尝试运行代码的方式仅在单个线程上工作,要同时执行某些操作,您需要启动一个新线程。

您可以使用 .Net 4.0 中的 Task 类,我将向您展示一个示例,但您需要根据需要对其进行修改

Task.Run(() => {

while (Variaveis_importadas[varfossaalarme] != Convert.ToInt32(situacao[3]))
{                
    Thread.Sleep(60000);                
    while (!ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Erro na função ClientGetVARs. Não foi possivel receber os dados.");
        Thread.Sleep(2000);
        Console.Clear();
    }

    if (ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
    {
        Console.WriteLine("Os dados foram recebidos.");
    }
    Thread.Sleep(2000);
    Console.Clear();                
}
});

  while (Variaveis_importadas[varst04] >= Convert.ToInt32(situacao[7]))
    {
        Thread.Sleep(60000);
        while (!ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
        {
            Console.WriteLine("Erro na função ClientGetVARs. Não foi possivel receber os dados.");
            Thread.Sleep(2000);
            Console.Clear();
        }
        if (ClientGetVARs(Variaveis_importadas, varLenght, fHandle_global))
        {
            Console.WriteLine("Os dados foram recebidos.");
        }
        Thread.Sleep(2000);
        Console.Clear();
    }

上面的代码将为您的第一个循环启动一个异步操作,而您的第二个循环将在您的主线程上运行。但是,您仍然需要知道何时停止“其他”线程,停止执行时要做什么等。

顺便说一句:Thread.Sleep 将锁定它们自己的线程,因此它们不会相互影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多