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();
是了解更多任务的重要资源
我有一个 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();
是了解更多任务的重要资源