线程仍然 运行 还是只是 LINQPad?
Is a thread still running or is it just LINQPad?
免责声明 1: 我了解多线程的概念,但正确的实现仍然让我望而却步。
免责声明 2: 我根本不是在批评 LINQPad,因为它太棒了。我只是想看看我是否遗漏了什么。
给定下面的代码,当调用 Console.WriteLine("Completed");
时线程是否仍然 运行ning?
我问是因为当我在 LINQPad 中 运行 我看到 Press Ctrl+Shift+F5 to cancel all threads 在右下角,然而,当我运行 与通过 VS 的控制台应用程序相同的代码,它似乎终止了。我完全有可能没有正确使用任务 and/or 没有正确终止它们。
public class TaskRunner
{
public async void RunTasks()
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task loadingTask =
new Task(() =>
{
//do something that takes a while, ie. database or service call
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("Loading");
}
});
Task entertainmentTask =
new Task(() =>
{
//do something until told to stop to keep user entertained
while (true)
{
if (ct.IsCancellationRequested)
{
break;
}
Console.WriteLine("Entertainment");
Thread.Sleep(50);
}
}, ct);
loadingTask.Start();
entertainmentTask.Start();
await Task.WhenAny(loadingTask, entertainmentTask);
cts.Cancel();
Console.WriteLine("Completed");
}
}
与您在 Visual Studio 中构建的普通可执行文件不同,LINQPad 在主线程完成后保持进程和应用程序处于活动状态,这意味着后台线程将继续 运行。
此外,当您重新运行 查询时,LINQPad 会回收相同的 process/AppDomain。这是一种性能优化,您还可以使用 LINQPad 的 Util.Cache 方法在查询 运行 之间缓存数据。例如:
void Main()
{
Util.Cache (TakesSomeTime).Dump();
}
int TakesSomeTime()
{
Thread.Sleep(2000);
return 42;
}
第一次查询 运行s,需要两秒。后续执行是即时的。
免责声明 1: 我了解多线程的概念,但正确的实现仍然让我望而却步。
免责声明 2: 我根本不是在批评 LINQPad,因为它太棒了。我只是想看看我是否遗漏了什么。
给定下面的代码,当调用 Console.WriteLine("Completed");
时线程是否仍然 运行ning?
我问是因为当我在 LINQPad 中 运行 我看到 Press Ctrl+Shift+F5 to cancel all threads 在右下角,然而,当我运行 与通过 VS 的控制台应用程序相同的代码,它似乎终止了。我完全有可能没有正确使用任务 and/or 没有正确终止它们。
public class TaskRunner
{
public async void RunTasks()
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Task loadingTask =
new Task(() =>
{
//do something that takes a while, ie. database or service call
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("Loading");
}
});
Task entertainmentTask =
new Task(() =>
{
//do something until told to stop to keep user entertained
while (true)
{
if (ct.IsCancellationRequested)
{
break;
}
Console.WriteLine("Entertainment");
Thread.Sleep(50);
}
}, ct);
loadingTask.Start();
entertainmentTask.Start();
await Task.WhenAny(loadingTask, entertainmentTask);
cts.Cancel();
Console.WriteLine("Completed");
}
}
与您在 Visual Studio 中构建的普通可执行文件不同,LINQPad 在主线程完成后保持进程和应用程序处于活动状态,这意味着后台线程将继续 运行。
此外,当您重新运行 查询时,LINQPad 会回收相同的 process/AppDomain。这是一种性能优化,您还可以使用 LINQPad 的 Util.Cache 方法在查询 运行 之间缓存数据。例如:
void Main()
{
Util.Cache (TakesSomeTime).Dump();
}
int TakesSomeTime()
{
Thread.Sleep(2000);
return 42;
}
第一次查询 运行s,需要两秒。后续执行是即时的。