2010-01-23 4 views
2

Windows 응용 프로그램과 dll (Windows 양식)을 열려고 시도하는 중 (ActivationCheck), 현재 스레드를 일시 중지하려고 시도하는 스레드가 새 스레드를 엽니 다. (ActivationCheck) 폼 이벤트가 true를 리턴 할 때까지 기다렸다가 주 스레드를 계속 진행합니다. 누군가 내가 무엇을 잘못했는지 보여 주실 수 있습니까? - 감사합니다.Windows Forms - 별도의 스레드를 걷어 내고 현재 스레드를 유지하는 방법

static class Program 
    { 
     private static SplashScreen splash; 
     private static bool quitApp; 
     private static bool activationFinished; 

     [STAThread] 
     static void Main() 
     { 

     Thread thread = new Thread(ActivationCheck); 
     thread.Start(); 



       do 
       { 
        Thread.Sleep(1000); 
       } while (activationFinished); 

      if (!quitApp) 
      { 


       Thread.Sleep(0); 
       // WizardRun(); 
       Application.Run(new Main(ref splash)); 
      } 
} 
} 

    private static void ActivationCheck() 
     { 

      splash.SetStatus = "Checking License..."; 

      Guid productId = new Guid(Properties.Settings.Default.ProductId); 
      Guid versionId = new Guid(Properties.Settings.Default.VersionId); 

      Client.UI.EntryPoint entryPoint = new EntryPoint(); 

      activationFinished = false; 

      Client.BLL.ProductActivation.GenerateTrialLicense(productId1, versionId2, EditionId3); 
      entryPoint.IniatePlugin(productId, versionId); 
      entryPoint.PluginFinished += new EventHandlers.PluginFinishEventHandler(entryPoint_PluginFinished); 


     } 
    static void entryPoint_PluginFinished(bool forceQuit) 
     { 
      quitApp = forceQuit; 
      activationFinished = true; 


     } 
+0

Marc가 말했듯이, 표시된 것은 두 번째 스레드가 필요함을 의미하지 않습니다. 내 응용 프로그램에 사용하는 플러그인 논리는 MainForm의 Load 이벤트 핸들러에서 기본 스레드의 일부로 발생합니다. –

+0

누군가 정말로 새로운 스레드를 생성해서는 안된다는 말을 들었습니다.이 경우에는 활성화 확인이 차단 호출이되고 스레드는 호출자를 차단하지 않도록 설계되어 새로운 스레드를 생성합니다. 네가하고 싶은 것이 아니라, –

답변

6

thread.Join() 할 수 있습니까? 솔직히 말하자면, 두 번째 스레드를 시작하는 것이 요점이고 어떤 것이 첫 번째를 일시 중지시키는 것이 확실하지 않습니다. 원래 스레드에서 작업을 수행합니까?

코드는 아마도 activationFinished이 레지스터에 저장되어있을 수 있습니다. volatile으로 표시하거나 lock에서이 변수에 액세스하는 두 자리를 사용하십시오. ManualResetEvent 또는 그 유사 물을 사용하고 활성화 코드에서 열어 보는 것이 좋습니다.

using System; 
using System.Threading; 
static class Program 
{ 
    static void Main() 
    { 
     new Thread(DoActivation).Start(); 
     Console.WriteLine("Main: waiting for activation"); 
     activation.WaitOne(); 
     Console.WriteLine("Main: and off we go..."); 
    } 
    static void DoActivation(object state) 
    { 
     Console.WriteLine("DoActivation: activating..."); 
     Thread.Sleep(2000); // pretend this takes a while 
     Console.WriteLine("DoActivation: activated"); 
     activation.Set(); 
     // any other stuff on this thread... 
    } 
    static ManualResetEvent activation = new ManualResetEvent(false); 
} 
관련 문제