.NET потоки в этом коде - PullRequest
       26

.NET потоки в этом коде

1 голос
/ 10 ноября 2008

Вот мой код:

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

В функции OpenFile мой код выглядит так:

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

Код в OpenFile не выполняется точно в течение 30 секунд. Он запускается сразу на моем компьютере, но в нашей производственной среде для выполнения этого оператора печати требуется 30 секунд.

Есть ли настройка или что-то, что может делать это? Где бы я начал искать?

Ответы [ 8 ]

1 голос
/ 10 ноября 2008

Как отмечали другие - сначала попытайтесь создать тестовую программу, которая демонстрирует поведение.

Если вы не можете, попробуйте устранить неполадки: 1. Вызовите метод напрямую, а не в потоке, и посмотрите, как он себя ведет. 2. Закомментируйте остальную часть кода, кроме строки System.Error.WriteLine

Если вы все еще видите задержку в (1), но не в (2), попробуйте присоединить к Событие AppDomain.AssemblyLoad . Я видел, как это происходит, когда в вызываемом методе есть вызов веб-службы (он генерирует сборку сериализации на лету, поэтому требуется время), или если есть первая ссылка на внешнюю сборку, и требуется время для найти и загрузить его. Это очень редко, но мне приходилось сталкиваться с этим, поэтому стоит попробовать.

1 голос
/ 11 ноября 2008

К сожалению, jeremyZX ответил в комментарии, поэтому за него нельзя проголосовать, но «Если вы ищете вывод в файл журнала, может быть тайм-аут на 30 секунд для любого tracelistener, с которым вы работали раньше» записи сбрасываются ", стоит посмотреть. Каждый раз, когда вы видите в системе задержку, воспринимаемую человеком, код, связанный с тайм-аутом, является одной из первых вещей, которую нужно проверить. Особенно , если вы видите задержку, которая падает на некоторое целочисленное значение, равное 10, 30, 60 секундам ...

1 голос
/ 10 ноября 2008

Есть ли у вас такая же проблема, если вы используете другие методы потоков (например, Threadpool)? Это скажет, связано ли это с этим методом многопоточности или со всеми методами. Кроме того, является ли этот оператор WriteLine единственным оператором в вашей процедуре OpenFile? 30 секунд - это обычное время ожидания, поэтому, возможно, именно это и происходит здесь.

Кроме этого, я не уверен, почему обработчик потока остановился бы на 30 секунд перед обработкой.

0 голосов
/ 11 ноября 2008

Иногда вывод (консоль, StreamWriters и т. Д.) Может быть отложен из-за проблем с очисткой. Если вы можете, используйте лучшую платформу регистрации, такую ​​как log4net или NLog, которая будет записывать временную метку, при которой метод фактически вызывается. Иногда я использую функциональность «OutputDebugString» log4net вместе с DebugView из SysInternals для более реалистичного вывода, хотя даже это подвержено задержкам синхронизации.

Проблема, которую вы описываете, похожа на настройку кэширования или производительности, и я подозреваю, что она на самом деле вызывается мгновенно.

0 голосов
/ 10 ноября 2008

Возможно, вы испытываете истощение потоков, то есть ваш поток не получает объем выполнения, потому что в вашем процессе выполняются потоки с более высоким приоритетом. Если этот поток более высокого уровня присутствует только в вашей производственной среде, а не в вашей среде тестирования, это может привести к другим результатам.

0 голосов
/ 10 ноября 2008

Прикладывается ли вашему приложению загрузка других сборок в память, сборок, которые уже могут быть в памяти на вашем компьютере? .NET приложения запускаются не сразу, а большее количество сборок означает больше времени загрузки. Вы можете попробовать предварительно скомпилировать с Native Image Generator .

0 голосов
/ 10 ноября 2008

Я не могу воспроизвести эту проблему. Следующая программа не страдает от 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");
        }
    }
}

Не могли бы вы предоставить больше контекста? В идеале, короткая, но полная программа, которая демонстрирует проблему.

И нет ошибок компиляции ...

0 голосов
/ 10 ноября 2008

Моим первым шагом будет создание тестовой версии приложения, которая вызывает функцию OpenFile обычным способом (без использования потоков), и проверим, по-прежнему ли вы получаете задержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...