c# - 线程仍在运行还是只是 LINQPad?

标签 c# multithreading linqpad

免责声明 1:我理解多线程的概念,但正确的实现仍然让我望而却步。

免责声明 2:我根本不是在批评 LINQPad,因为它太棒了。我只是想看看我是否遗漏了什么。

给定下面的代码,当调用 Console.WriteLine("Completed"); 时线程是否仍在运行?

我问是因为当我在 LINQPad 中运行时,我在右下角看到 Press Ctrl+Shift+F5 to cancel all threads,然而,当我运行与控制台应用程序相同的代码时VS,好像终止了。我完全有可能没有正确使用任务和/或没有正确终止它们。

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 会回收相同的进程/AppDomain。这是一种性能优化,您还可以使用 LINQPad 的 Util.Cache 方法在查询运行之间缓存数据。例如:

void Main()
{
   Util.Cache (TakesSomeTime).Dump();
}

int TakesSomeTime()
{
   Thread.Sleep(2000);
   return 42;
}

此查询第一次运行时,需要两秒钟。后续执行是即时的。

关于c# - 线程仍在运行还是只是 LINQPad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786201/

相关文章:

c# - Asp.Net Core 3(Blazor 客户端)构建失败

c# - 将 CheckBox 从 DataTemplate 绑定(bind)到 ListBox 中的 TemplatedParent

c# - 测试函数内部或外部是否需要更好?

ios - 核心数据多线程性能

c - WSAWaitForMultipleObjects 阻塞除最后一个以外的任何线程

linq - 在 LINQPad 中使用数据上下文作为方法参数

linqpad - 如何在 lprun 中指定 LINQPAD.config 文件

c# - 使用 HtmlAgilityPack 解析 dl

c++ - 如何并行优化大数据操作

c# - 如何在 LinqPad 中提交更改