线程是否还在运行还是只是LINQPad?

时间:2017-03-14 12:36:03

标签: c# multithreading linqpad

免责声明1:我理解多线程的概念,但正确的实现仍然无法实现。

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

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

我问,因为当我在LINQPad中运行时,我看到按Ctrl + Shift + F5取消右下角的所有线程,但是,当我通过控制台应用程序运行相同的代码时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");
    }
}

1 个答案:

答案 0 :(得分:2)

与在Visual Studio中构建的普通可执行文件不同,LINQPad在主线程完成后使进程和应用程序保持活动状态,这意味着后台线程将继续运行。

此外,重新运行查询时,LINQPad会回收相同的进程/ AppDomain。这是性能优化,您还可以使用LINQPad的Util.Cache方法在查询运行之间缓存数据。例如:

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

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

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