2012-10-20 79 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