C#中Action的奇怪行为

时间:2018-02-23 10:01:42

标签: c# multithreading

我从我的同事那里得到了一段我感到困惑的代码。根据我对线程和操作的有限了解,在调用BeginInvoke之后不会发生操作超时,同时操作中的代码(更确切地说是此处的匿名方法)没有甚至开始执行。但我的同事说,在其中一个环境中,它正在发生。因此,只是通过代码来模仿它,在这种情况下,这种输出可能来自以下代码?

        IAsyncResult result;
        Action action = () =>
        {
            Console.WriteLine("Action started!!");
            Thread.Sleep(2000); // Assume a long running operation here which might take more than 15000 ms as well, resulting in timeout
            Console.WriteLine("Now the action got completed!!");
        };

        result = action.BeginInvoke(null, null);

        if (result.AsyncWaitHandle.WaitOne(15000))
        {
            Console.WriteLine("Timeout didn't happen!!");
        }
        else
        {
            Console.WriteLine("Timeout happened!!");
        }


        Console.WriteLine("Main thread continues to work!!");

输出:

========================

超时没有发生!!

主线程继续工作!!

========================

P.S。甚至没有“行动开始!!”在长时间或时间操作之前写入的输出中存在。 同样在实际代码中,将Console.WriteLine替换为在文件中写入日志。

编辑:

  • @LasseVågsætherKarlsen为了提供更多的上下文,环境我指的是不同的服务器,它显示这种奇怪的行为的是生产服务器,所以你可以估计它有更多的负载和方式更多的任务执行比开发服务器或内部测试(这是按预期工作)。

  • 这是一个WCF服务,它由各个服务器上的管理员用户部署和运行。

  • 同样正如我所指出的那样,日志是在一个文件中写的,并且它不是实际代码中的简单Console.WriteLine(我没有编写或测试过,因为它是我同事的代码)。我的直觉说这就是问题所在,因为甚至没有“行动开始!!”写在日志文件中。即使是这种情况的相关链接,甚至是使用Task的替代方法也会有所帮助,这可以保证非奇怪!

0 个答案:

没有答案