2015-01-04 10 views
-4

이것은 현재 창을 고정시키는 코드입니다. 이 양식을 동결하지 않는 방법.C# 스레드가 고정 창을 호출합니다.

public partial class Form1 : Form 
{ 
    Thread t; 

    int s = 0; 
    public Form1() 
    { 
     InitializeComponent(); 

     label2.Text = "Push the Button"; 
     button1.Text = "Push me!"; 
     button1.Click += new EventHandler(button1_Click); 

     this.Controls.Add(label2); 
     this.Controls.Add(button1); 
    } 

    void button1_Click(object sender, EventArgs e) 
    { 
     t = new Thread(new ThreadStart(RunMe)); 
     t.Start(); 
    } 

    private void RunMe() 
    { 
      if (!InvokeRequired) 
      { 
       while(true) 
       { 
        label2.Text = s.ToString(); 
        s++; 
        Task.Delay(10000).Wait(10000); 
       } 
      } 
      else 
      { 
       Invoke(new ThreadStart(RunMe)); 
      } 
    } 


    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
} 
+1

'Invoke'는 UI 스레드에서 일부 코드를 실행하므로 UI ​​스레드에서 * 전체 무한 루프 *를 실제로 실행하므로 영구적으로 차단됩니다. – Chris

답변

0

에만이 같은 라벨을 업데이트하는 호출을 호출해야합니다 : 다른 사람이 언급 한 것처럼

while(true) 
{ 
    if (!InvokeRequired) 
    { 
     label2.Text = s.ToString(); 
    } 
    else 
    { 
     Invoke(new Action(()=>{label2.Text = s.ToString();})); 
    } 
    s++; 
    Task.Delay(10000).Wait(10000); 
} 
+0

람다식이 대리자 형식이 아니기 때문에 'System.Delegate'형식으로 변환 할 수 없습니다. –

1

귀하의 코드는 .NET 4.5을 사용하는 경우 async-await를 사용하여 혜택을 누릴 수 있습니다. await을 사용하면 RunMe 메서드에 대해 별도의 스레드를 시작할 필요가 없으므로 UI ​​스레드를 해제하여 다른 작업을 수행하지만 Invoke을 사용하여 UI를 업데이트 할 필요가 없도록 SynchronizationContext가 캡처됩니다. 작동 원리는 this blog을 참조하십시오.

난 당신이 같은 코드를 다시 작성할 수 있어야한다고 생각 :

async void button1_Click(object sender, EventArgs e) 
{ 
    // kicks off the RunMe method and returns 
    await RunMe(); 
} 

private Task RunMe() 
{ 
    while(true) 
    { 
     label2.Text = s.ToString(); 
     s++; 
     await Task.Delay(10000); 
    }  
} 

방법은 UI 스레드에서 매우 짧은 시간 동안 라벨을 업데이트 깨어나서 실행 무한 while 루프에도 불구하고.