programing

여러 시작 프로젝트 간의 Visual Studio 지연?

jooyons 2023. 5. 10. 20:51
반응형

여러 시작 프로젝트 간의 Visual Studio 지연?

솔루션의 시작 프로젝트 사이에 약간의 지연을 추가하는 방법은 무엇입니까?

여기에 이미지 설명 입력

Windows Service를 시작한 후 2-3초 후에 클라이언트 프로젝트를 시작했으면 합니다.

이게 왜 필요한 거지?

윈도우즈 서비스는 소켓 서버를 실행하고 클라이언트는 소켓을 실행하여 서버에 연결합니다.Windows Service가 Client보다 느리게 로드되므로 아직 실행되지 않은 서버에 연결할 때 클라이언트 측에서 예외가 발생합니다.

클라이언트 내에 재시도 메커니즘을 추가할 것입니다.이러한 방식은 "Visual Studio에서 시작" 사례에서 도움이 될 뿐만 아니라 실제 클라이언트가 연결되는 동안 서버가 다시 시작되는 경우에도 도움이 됩니다.서버가 더 빠른 컴퓨터에 있다는 것이 서버를 다시 시작할 필요가 없다는 것을 의미하지는 않습니다. 그렇죠?

실제로 서버가 연결되어 있는 동안 서버가 다시 시작되더라도 클라이언트가 복구할 수 있는 방식으로 이 재시도 메커니즘을 추가할 수 있습니다.물론 프로젝트가 무엇을 하고 있는지에 따라 다릅니다.

Mutex 잠금을 사용하여 두 시작 프로젝트를 동기화할 수 있습니다.

프로그램 1(스타트업 프로젝트 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(스타트업 프로젝트 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();
        }
    }
}

테스트를 위한 또 다른 간단한 옵션은 디버거가 다음과 같이 연결된 경우 클라이언트를 지연시키는 것입니다.

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

당신은 그것을 포장할 수 있습니다.#if DEBUG원한다면 차단합니다.어쨌든 저는 이것이 최소한의 일이어야 한다고 생각합니다 :)

여러 개의 시작 프로젝트의 경우 동시에 또는 임의로 지정되지 않은 순서대로 로드됩니다. 여기에 이미지 설명 입력 http://msdn.microsoft.com/en-us/library/09138bex(v=vs.90).aspx

따라서 "윈도우 서비스" 뒤에 "클라이언트"를 지정하면 문제가 없을 수 있습니다.그리고 위에서 제안한 코딩 방법을 원하지 않는 경우(테스트 전용) 원하는 지연 후 다른 솔루션의 "클라이언트" 프로세스를 수동으로 솔루션에 연결할 수 있습니다.http://msdn.microsoft.com/en-us/library/c6wf8e4z(v=vs.100).aspx

클라이언트를 시작한 후에 시작해야 하는 경우 목록을 이전에 시작한 순간처럼 조정해야 합니다!

저는 또한 "/wait"를 코딩할 것입니다. 앱을 로드할 때 해당 플래그가 발견되면 사용에 유용할 수 있을 때까지 기다립니다.

서버 프로젝트를 단일 시작 프로젝트로 설정하고 이 매크로를 사용하여 서버와 클라이언트를 지연된 상태로 시작할 수 있습니다.

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

도구 모음에 단추를 추가하거나 바로 가기 키를 사용하여 이 매크로를 실행할 수 있습니다.

소켓이 열려 있는지 확인하는 절차만 추가하면 됩니다.소켓이 열려 있으면 코드를 계속 실행하고 소켓이 열려 있지 않은지 다시 확인합니다.이렇게 하면 나중에 윈도우 서비스를 시작해도 문제가 없습니다.

현재 작업 중인 n-tier 어플리케이션의 경우 Romil에서 제안한 Mutex 메서드(약간 다른 코드이지만 동일한 원리)를 결합하여 [Conditional("DEBUG")] 속성이 적용된 메서드 내에서 캡슐화했습니다(그래서 릴리스 모드에서 제거됨).또한 mutex 로직을 if(System)로 묶습니다.진단.디버거.연결됨) QA 빌드에서 디버그 모드를 사용하므로 {...}.

우리는 원래 쓰레드를 사용했습니다.대부분의 개발자 컴퓨터에서 작동하는 대기 시간으로 잠을 잤지만, 개발자의 컴퓨터 속도가 다양하고 서버 부트스트래퍼에 점점 더 추가되면서 대기 시간을 계속 늘려야 했기 때문에 문제가 발생했습니다.

지연을 설정하는 인수를 클라이언트 애플리케이션에 전달하는 것이 어떻습니까?

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

  // Initialize client
}

이제 지연 시간(밀리초)을 프로젝트 시작에 대한 명령줄 인수에 추가할 수 있습니다.

가능하면 구조적으로 문제를 해결하는 것이 좋으니 고객과 서버가 언제 시작하든 상관없다는 데도 동의합니다.

언급URL : https://stackoverflow.com/questions/10349311/visual-studio-delay-between-multiple-startup-projects

반응형