Подтвердить что ты не робот

Задержка Visual Studio между несколькими запускаемыми проектами?

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

enter image description here

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

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

WindowsService запускает сервер сокетов, а клиент запускает сокет для подключения к серверу. WindowsService загружается медленно, чем клиент, и это вызывает исключение на стороне клиента при подключении к серверу, который еще не запущен

4b9b3361

Ответ 1

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

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

Ответ 2

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

Программа 1 (ProjectUp 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();
            }
        }

    }
}

Программа 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();
        }
    }
}

Ответ 3

В случае нескольких стартовых проектов они загружаются в том порядке, в котором они указаны, ни одновременно, ни случайным образом. enter image description herehttp://msdn.microsoft.com/en-us/library/09138bex(v=vs.90).aspx

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

Ответ 4

Другим более простым вариантом для тестирования является просто задержка клиента, если отладчик подключен следующим образом:

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

  // Initialize client
}

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

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

Ответ 8

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

Ответ 9

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

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