c# 控制台应用程序 - 运行 for(;;) 循环,同时不干扰其余的执行代码

c# Console Application - Run for(;;) loop while not disturbing rest of executing code

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

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

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

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

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

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

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

使用多线程:

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

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

"Test" 没有打印出来是因为在上一行调用了 ExecuteForLoop() 方法,程序进入了死循环。因为,两个语句都在同一个线程中,只有前一个语句才能执行后一个语句,这当然是不可能的。

在里面创建一个 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 articles/blog关于线程的内容,非常详细。

你几乎不应该直接使用 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.

是了解更多任务的重要资源