2017-12-12 4 views
1

내 winform에 취소 단추를 추가하기 위해 백그라운드 작업자를 사용하려고합니다.Winforms에서 백그라운드 작업자가 TextBox를 업데이트하지 않습니다.

아래 구문을 추가했지만 백그라운드 작업자를 구현하기 전의 텍스트 상자가 진행 상황으로 업데이트되지 않습니다.

public Form1() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
    { 
     string resourceName = new AssemblyName(args.Name).Name + ".dll"; 
     string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName)); 

     using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)) 
     { 
      Byte[] assemblyData = new Byte[stream.Length]; 
      stream.Read(assemblyData, 0, assemblyData.Length); 
      return Assembly.Load(assemblyData); 
     } 
    }; 
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.WorkerSupportsCancellation = true; 
} 
private void btnQuery_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

     //Iterating the array 
     foreach (string s in sxc) 
     { 
      txt_ProgressDetails.Visible = true; 
      AppendTextBoxLine("Getting Data For " + s); 

      //Put data into DataTable 
      PopulateDT(s); 
     } 

     //If the cancel button was pressed 
     if (backgroundWorker1.CancellationPending) 
     { 
      e.Cancel = true; 
      return; 
     } 
} 

    private void AppendTextBoxLine(string statusMessage) 
    { 
     if (txt_ProgressDetails.Text.Length > 0) 
      txt_ProgressDetails.AppendText(Environment.NewLine); 
     txt_ProgressDetails.AppendText(statusMessage); 
    } 
+0

귀하의 코드가 보이는 :

if (InvokeRequired) { UpdateUICallback d = new UpdateUICallback(AppendTextBoxLine); this.Invoke(d, new object[] {statusMessage}); } else { if (txt_ProgressDetails.Text.Length > 0) txt_ProgressDetails.AppendText(Environment.NewLine); txt_ProgressDetails.AppendText(statusMessage); } 

그래서 코드는 다음과 같이됩니다 거의 색다른. if (backgroundWorker1.CancellationPending)의 체크 포인트는 무엇입니까? 너무 늦었 어. – Enigmativity

답변

2

BackgroundWorker의 Do_Work 이벤트는 비 STA 스레드에서 실행되며 거기에서 UI를 업데이트 할 수 없습니다. 코드를 다시 작성하여 UI 요소를 InvokeRequredInvoke 메서드로 만든 스레드에서 UI 요소를 업데이트 할 수 있습니다. 이에 AppendTextBoxLine 방법을

delegate void UpdateUICallback(string statusMessage); 

을 그리고 변경 :

당신의 양식이 추가

public Form1() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
    { 
     string resourceName = new AssemblyName(args.Name).Name + ".dll"; 
     string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName)); 

     using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)) 
     { 
      Byte[] assemblyData = new Byte[stream.Length]; 
      stream.Read(assemblyData, 0, assemblyData.Length); 
      return Assembly.Load(assemblyData); 
     } 
    }; 
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.WorkerSupportsCancellation = true; 
} 
private void btnQuery_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

     //Iterating the array 
     foreach (string s in sxc) 
     { 
      txt_ProgressDetails.Visible = true; 
      AppendTextBoxLine("Getting Data For " + s); 

      //Put data into DataTable 
      PopulateDT(s); 
     } 

     //If the cancel button was pressed 
     if (backgroundWorker1.CancellationPending) 
     { 
      e.Cancel = true; 
      return; 
     } 
} 

delegate void UpdateUICallback(string statusMessage); 
private void AppendTextBoxLine(string statusMessage) 
{ 
    if (InvokeRequired) 
    { 
     UpdateUICallback d = new UpdateUICallback(AppendTextBoxLine); 
     this.Invoke(d, new object[] {statusMessage}); 
    } 
    else 
    { 
     if (txt_ProgressDetails.Text.Length > 0) 
       txt_ProgressDetails.AppendText(Environment.NewLine); 
     txt_ProgressDetails.AppendText(statusMessage); 
    } 
} 
+0

위임자 음성을 추가하면 UpdateUICallback(); 내 Form1에() 여러 컴파일 오류가 발생 – user2676140

+0

왜? 컴파일 오류는 무엇입니까? 메서드가 하나의 문자열 인수를 이전 코드로 취할 수 있도록 답변을 편집했습니다. –

+0

나는이 질문을 대답하고 동시에 대답을 수정했습니다. –

관련 문제