Вопрос по .net, visual-studio-2010, c#, vb.net – Visual Studio задержка между несколькими запускаемыми проектами?

28

Как добавить некоторую задержку между запуска проектов в решении?

enter image description here

Я хочу, чтобы клиентский проект запускался через 2-3 секунды после запуска WindowsService.

Зачем мне это нужно?

WindowsService runs socket server and Client runs socket to connect to server. WindowsService loads slowly than Client, and this causes an exception on client side when connecting to server which is not run yet

оба эти приложения доступны на одной машине? Romil Kumar Jain
Windowservice - это обычный проект, он не размещается в службах Windows и не запускается оттуда. это выполняется из локального кода приложения. Это правильно. Romil Kumar Jain
какое-нибудь окончательное решение с полным примером исходного кода работает над этим? Kiquenet
Исправьте проблему в своем коде, это произойдет и в реальной жизни. Hans Passant

Ваш Ответ

9   ответов
9

В случае нескольких проектов запуска,they are loaded in the order they are specified ни одновременно, ни случайно.enter image description here http://msdn.microsoft.com/en-us/library/09138bex(v=vs.90).aspx

Таким образом, может быть, если вы укажете «клиент» после «оконного сервиса» он может работать нормально. И если вы не хотите использовать кодированный способ, предложенный выше, то (только для тестирования) вы можете вручную присоединить «клиент». обработать вам решение из другого решения после желаемой задержки. http://msdn.microsoft.com/en-us/library/c6wf8e4z(v=vs.100).aspx

8

Другой более простой вариант для тестирования - просто отложить клиент, если отладчик подключен так:

if (System.Diagnostics.Debugger.IsAttached)
{
    System.Threading.Thread.Sleep(2000);
}

Вы можете обернуть это в#if DEBUG заблокировать, если хотите. Во всяком случае, я думаю, что это должно быть наименьшее количество работы :)

13

Вы можете использовать Mutex для синхронизации двух запуска проекта.

Program 1 (StartUp Project 1):

    namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;

    class Program1
    {
        private static  bool isNewMutexCreated = true;
        private static Mutex mutex;
        static void Main(string[] args)
        {
            mutex = new Mutex(true, "Global\\ConsoleApplication1", out isNewMutexCreated);
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
            Console.WriteLine("Application1 executed on " + DateTime.Now.ToString());

            Console.ReadKey();
        }

        static void CurrentDomain_ProcessExit(Object sender, EventArgs e)
        {
            if (isNewMutexCreated)
            {
                Console.WriteLine("Mutex Released");
                mutex.ReleaseMutex();
            }
        }

    }
}

Program 2 (StartUp Project 2):

namespace ConsoleApplication2
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;

    class Program2
    {
        static void Main(string[] args)
        {
            Mutex mutex = null;
            Thread.Sleep(5000);

            while (mutex == null)
            {
                try
                {
                    mutex = Mutex.OpenExisting("Global\\ConsoleApplication1");

                }
                catch (Exception)
                {
                    Console.WriteLine("Mutex not found on " + DateTime.Now.ToString());
                    Thread.Sleep(3000);
                }


            }
            Console.WriteLine("Application2 executed on " + DateTime.Now.ToString());
            Console.ReadKey();
        }
    }
}
5

Если клиент должен быть запущен после, вам нужно настроить свой список, так как в данный момент его запускали раньше!

Я также написал бы код "/ wait" который при загрузке приложения, если он находит этот флаг, ждет его, может быть, также полезен в использовании

Он только настраивает, какой запускать первым, а не задержку между ними! Lev
да, следовательно, последующие программы имеют опцию / wait: P, которую вы можете использовать исключительно как недокументированную функцию или выбрать для публикации, sh .. изменение порядка запуска осуществимо, вы можете заставить его сказать / ждать 1000 или просто / ждать и просто иметь некоторый код, который вы используете, чтобы вызвать задержку, с которой вы хотите работать.
0

Почему бы вам просто не передать аргумент клиентскому приложению, которое устанавливает задержку?

static void main(string[] args)
{
  // Sleep some time
  int delay;
  if (args.Length > 0 && int.TryParse(args, out delay))
  {
    Thread.Sleep(delay);
  }

  // Initialize client
}

Теперь вы можете добавить задержку в миллисекундах к аргументам командной строки для запуска проекта.

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

0

Просто добавьте процедуру, чтобы проверить, открыта ли розетка или нет. Если сокет открыт, продолжайте выполнять код и попробуйте еще раз проверить, не открыт ли сокет. Таким образом, даже если вы запустите службу Windows позже, проблем не будет.

3

Вы можете установить серверный проект как единый проект запуска и использовать этот макрос для запуска сервера и клиента с задержкой:

Sub DebugServerAndClientWithDelay()
    DTE.Debugger.Go(False)
    System.Threading.Thread.Sleep(2000)
    DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate()
    DTE.ActiveWindow.Object.GetItem("SolutionName\ClientProjectName").Select(vsUISelectionType.vsUISelectionTypeSelect)
    DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance")
End Sub

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

0

Для n-уровневого приложения, над которым я сейчас работаю, я объединил метод Mutex, предложенный Ромилом (немного другой код, но тот же принцип), и инкапсулировал его в метод с примененным атрибутом [Conditional (& quot; DEBUG & quot;)] (так что удаляется в режиме релиза). Мы также окружаем логику мьютекса с помощью if (System.Diagnostics.Debugger.IsAttached) {...}, так как сборки QA используют режим отладки.

Изначально мы просто использовали Thread.Sleep с периодом ожидания, который работал для большинства машин разработчиков, но мы столкнулись с проблемами, потому что devs & apos; Скорость компьютера варьируется, и поскольку мы все больше и больше добавляем загрузчик сервера, нам приходилось увеличивать период ожидания.

28

Я бы, вероятно, добавил механизм повтора в клиенте. Таким образом, это не только помогает при запуске из Visual Studio. дело - этоalso помогает, если сервер перезагружается при подключении реального клиента. Тот факт, что сервер работает на более быстрой машине, не означает, что серверу никогда не потребуется перезапускаться, не так ли?

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

какой-нибудь полный образец о механизме Retry?
@Kiquenet: Нет, но не так сложно поместить код подключения в цикл ...

Похожие вопросы