2012-10-20 114 views
0

嘿,我有這個測試回地面工人似乎卡在DoWork方法或RunWorkerCompleted沒有被解僱,你們可以看到這裏有什麼不對嗎?C#後臺工作者DoWork被卡住

也許我沒有實現這個正確:/

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 

     using System.Threading.Tasks; 
     using System.Windows.Forms; 
     using MailChimp; 
     using System.Threading; 
     using System.Runtime.InteropServices; 

     namespace Chimporter 
     { 
      public partial class Form1 : Form 
      { 
       //Worker thread flag set to false 
       static bool done = false; 
       //Console dll 
       [DllImport("Kernel32.dll")] 
       static extern Boolean AllocConsole(); 

       public Form1() 
       { 
        InitializeComponent(); 
       } 

       private void button1_Click(object sender, EventArgs e) 
       { 

       } 

       private void label1_Click(object sender, EventArgs e) 
       { 

       } 



       private void accountInformationToolStripMenuItem_Click(object sender, EventArgs e) 
       { 
        //loadWindow pleaseWait = new loadWindow(); 
        //pleaseWait.Show(); 
        BackgroundWorker bg = new BackgroundWorker(); 
        bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
        bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted); 
        bg.RunWorkerAsync(); 
        while (!done) 
        { 
         //Console.WriteLine("Waiting in Main, tid " + Thread.CurrentThread.ManagedThreadId); 
         //Thread.Sleep(100); 

        } 
        //AccountInfo accInfo = new AccountInfo(); 
        //accInfo.Show(); 

       } 

       public void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
       { 
        if (!AllocConsole()) 
        { 
         Console.WriteLine("Fnished! " + Thread.CurrentThread.ManagedThreadId); 
        } 
        done = true; 
       } 

       public void bg_DoWork(object sender, DoWorkEventArgs e) 
       { 
        for (int i = 0; i <= 3; i++) 
        { 
         if (!AllocConsole()) 
         { 
          Console.WriteLine("Work Line: " + i + ", tid " + Thread.CurrentThread.ManagedThreadId); 
          Thread.Sleep(500); 
         }     
        }    
        //string key = "e42713458882f6c2c27b3d6d951174a2-us6"; 
        //var mc = new MCApi(key, true); 
        //string user = mc.GetAccountDetails().Username.ToString(); 
        return; 
       } 

       private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
       { 

       } 

       private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
       { 
        //Exit application Form.Close() 
        Application.Exit(); 
       } 
      } 
     } 
+0

嗯,我輸出第三個控制檯線程ID,然後卡住,我的PC風扇變得響亮:S – Kal

+0

我看到三條'工作線',然後'完成'。 –

回答

2

把你while (!done)出來。它鎖定了主線程。工作人員完成的事件在該線程中得到提升,但由於它在一個循環中忙碌,因此永遠不會升起。

RunWorkerCompleted事件的重點是讓您在主線程中獲得通知,並且不必在繁忙循環中將其鎖定並使您的GUI無響應。

+0

傻我:(,我會成爲一個更好的編碼器:(。謝謝很多人:) – Kal