2015-11-20 103 views
1

一直在尋找答案,但我無法弄清楚。我不像其他一些語言那樣熟悉C#,任何信息都會有所幫助。無論我嘗試什麼樣的形式,在運行後臺工作時都會凍結。凍結異步背景工作者

backgroundWorker1.RunWorkerAsync(filepath); 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string filepath = e.Argument.ToString(); 

     using (Image image = Image.FromFile(filepath)) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       image.Save(ms, ImageFormat.Png); 
       byte[] imageBytes = ms.ToArray(); 
       string base64String = Convert.ToBase64String(imageBytes); 
       e.Result = base64String; 
      } 
     } 
     System.Threading.Thread.Sleep(1000); 
    } 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     textBox1.Text = e.Result.ToString(); 
    } 
+0

是凍結一秒鐘? – StepUp

+0

刪除System.Threading.Thread.Sleep(1000); – Dimitri

+1

表格凍結是什麼意思?它會停止響應用戶輸入嗎?它會停止重繪嗎?或者你的意思是說,在工人完成之前它沒有做任何有趣的事情? – adv12

回答

0

您的代碼看起來是正確的。但是,您暫停後臺線程1秒鐘。爲了避免這種情況,你應該剛剛刪除的代碼此行:

System.Threading.Thread.Sleep(1000); 
+3

這是在BackgroundWorker內。如果工作人員實際上正在異步執行,不會影響用戶界面。 –

0

您應該考慮使用異步/等待微軟recomends到位的BackgroundWorker的使用它。

假設你的工人被觸發按鈕單擊事件裏面,它應該是這樣的:

private async void button1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = await Task.Run(() => 
     { 
      using (Image image = Image.FromFile(filepath)) 
      { 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        image.Save(ms, ImageFormat.Png); 
        byte[] imageBytes = ms.ToArray(); 
        string base64String = Convert.ToBase64String(imageBytes); 
        return base64String; 
       } 
      } 
     }); 
    } 
+0

儘管有幫助,但它並沒有真正回答這個問題。 OP需要回應您的評論。 – LarsTech

+0

謝謝,但使用async/await代碼似乎與後臺工作程序一樣。表單仍會凍結,直到操作完成 –

+0

您使用的任何方法都不應凍結UI。代碼中必須有一些你沒有告訴我們的東西。 –