此代码中的.NET线程

时间:2008-11-10 19:17:44

标签: .net multithreading

这是我的代码:

ThreadStart threadStart = controller.OpenFile;
Thread thread = new Thread(threadStart);
thread.Start();

在OpenFile函数中,我的代码如下:

System.Console.Error.WriteLine("Launching");

OpenFile中的代码没有完全执行30秒。它立即在我的机器上启动,但在我们的生产环境中,执行该打印语句需要30秒。

是否有设置或其他可能正在执行此操作的内容?我在哪里开始寻找?

8 个答案:

答案 0 :(得分:1)

如果使用其他线程方法(例如,Threadpool),是否会遇到同样的问题?这将告诉它是否与这种线程方法或所有方法有关。另外,WriteLine语句是OpenFile过程中唯一的语句吗? 30秒是一个常见的超时长度,所以也许就是这里发生的事情。

除此之外,我不确定为什么线程处理程序会在处理之前暂停30秒。

答案 1 :(得分:1)

正如其他人指出的那样 - 首先尝试制作一个演示行为的测试程序。

如果您不能,请尝试通过以下方式进行问题排查: 1.直接调用方法,而不是线程,并查看它的行为方式。 2.注释除System.Error.WriteLine行

之外的其余代码

如果仍然在(1)中看到延迟,但在(2)中仍未看到延迟,则尝试附加到AppDomain.AssemblyLoad Event。我已经看到这种情况发生在被调用方法中有一个Web服务调用(它动态生成序列化程序集,所以需要时间),或者如果有第一个引用外部程序集,并且需要时间找到并加载它。这是非常罕见的,但我不得不处理这个,所以值得尝试。

答案 2 :(得分:1)

不幸的是,jeremyZX在评论中回答,因此无法进行投票,但是“如果您正在寻找日志文件的输出,那么对于您之前使用的任何一个tracelistener,可能会有30秒的超时时间条目被刷新“非常值得一看。每当您在系统中看到人类可察觉的延迟时,与超时相关的代码就是首先需要检查的内容之一。 特别是如果你看到一个延迟落在10,30,60秒的超时整数...

答案 3 :(得分:0)

我的第一步是构建一个以正常方式调用OpenFile函数的应用程序的测试版本(不使用线程),看看你是否还有延迟。

答案 4 :(得分:0)

我无法重现这个问题。以下程序不会受到30秒的延迟:

using System;
using System.Threading;

namespace Net_Threading_Problem
{
    class Program
    {
        static void Main()
        {
            Controller controller = new Controller();
            ThreadStart threadStart = controller.OpenFile;
            Thread thread = new Thread(threadStart);
            thread.Start();

            thread.Join();
        }
    }

    internal class Controller
    {
        public void OpenFile()
        {
            Console.Error.WriteLine("Launching");
        }
    }
}

你能提供一些更多的背景吗?理想情况下,这是一个简短而完整的程序,用于演示问题。

并且没有任何编译错误......

答案 5 :(得分:0)

您的应用程序是否必须将其他程序集加载到内存中,程序集中可能已存在于计算机的内存中? .NET应用程序无法立即启动,更多程序集意味着更多的加载时间。您可以尝试使用Native Image Generator进行预编译。

答案 6 :(得分:0)

也许您遇到线程饥饿,这意味着您的线程没有获得执行量,因为在您的进程中执行优先级较高的线程。如果此更高级别的线程仅存在于生产环境中而不存在于测试环境中,则可能导致不同的结果。

答案 7 :(得分:0)

有时输出(控制台,StreamWriters等)可能因刷新问题而延迟。如果可以,请使用更好的日志记录平台,例如log4net或NLog,它将记录实际调用该方法的时间戳。我有时使用log4net的“OutputDebugString”功能以及来自SysInternals的DebugView来获得更真实的输出,尽管这很容易受到时序延迟的影响。

您所描述的问题似乎是缓存或性能设置,我怀疑它实际上是在即时调用。