【问题标题】:c# Console Application - Run for(;;) loop while not disturbing rest of executing codec# 控制台应用程序 - 运行 for(;;) 循环,同时不干扰其余执行代码
【发布时间】:2016-03-01 04:15:56
【问题描述】:

我有一个 C# 控制台应用程序,它需要在应用程序开始运行时立即调用一个函数,在此示例中为 ExecuteForLoop();

这是我的 C# 控制台应用程序开始运行的方式:

static void Main()
{
    ExecuteForLoop();
    Console.Write("Test");
}

此示例中的函数ExecuteForLoop() 执行此操作:

ExecuteForLoop()
{
    int example = 0;
    for(;;)
    {
        example++;
    }
}

问题是,如果我调用 ExecuteForLoop() 函数,Console.Write("Test"); 函数不会立即执行。只有在ExecuteForLoop() 中的for(;;) 循环停止循环后,"Test" 才会输出到我的控制台。

我如何调用ExecuteForLoop() 并继续执行代码,以便在ExecuteForLoop() 函数中的for(;;) 循环仍在运行时将函数Console.Write("Test"); 输出到我的C# 控制台应用程序?

【问题讨论】:

  • 你需要使用线程
  • 花一些时间研究并行Tasks 和同步。这部分是绝对有必要知道的。
  • ExecuteForLoop()内部形成无限循环需要指定退出条件

标签: c# console-application


【解决方案1】:

您几乎不应该直接使用Thread

请改用Tasks。它们是更高级别的抽象,比线程更容易使用。

一个简单的例子:

var backgroundTask = Task.Run(() =>
{
    Console.WriteLine("Background task started");
    while (true)
    {
        //do something
    }
});

Console.WriteLine("Back in main");
Console.ReadKey();

另一种,按键后取消任务并返回结果:

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var backgroundTask = Task.Run(() =>
{
    Console.WriteLine("Background task started");
    long count = 0;
    while (!token.IsCancellationRequested)
    {
        count++;
    }
    Console.WriteLine("Background task cancelled");
    return count;
}, token);

Console.WriteLine("Back in main");
Console.ReadKey();
tokenSource.Cancel();
Console.WriteLine("Counter: {0}", backgroundTask.Result);
Console.ReadKey();

Stephen Cleary's blog 是一个很好的资源来了解有关任务的更多信息。

【讨论】:

    【解决方案2】:

    创建一个Thread 并在里面运行你的逻辑

    static void Main()
    {
    
        Thread t = new Thread (ExecuteForLoop);          // Kick off a new thread
        t.Start();  
    
        Console.Write("Test");
    
        t.Join();  // wait for thread to exit.
    }
    

    我推荐阅读Albahari有关线程的文章/博客,非常详细。

    【讨论】:

      【解决方案3】:

      使用多线程:

      static void Main()
      {
          var t = new Thread(() => ExecuteForLoop());
          t.Start();
          Console.Write("Test");
          t.Join() // See this answer : http://stackoverflow.com/a/14131739/4546874
      }
      

      另外,这可能不是您想要的。您确定在方法中需要 infinite for 循环吗?如果没有,请查看 for-loop 的语法并相应地设置退出条件。

      "Test" 没有打印出来,因为在上一行中您调用了ExecuteForLoop() 方法,其中程序运行到无限循环中。由于两条语句在同一个线程中,因此后者不能执行,除非前者在,这当然是不可能的。

      【讨论】:

      • 谢谢!完美运行:)
      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 2016-05-01
      相关资源
      最近更新 更多