C#背景工人工作陷入困境

C#背景工人工作陷入困境,c#,.net,winforms,backgroundworker,C#,.net,Winforms,Backgroundworker,嘿,我有一个测试后台工作人员,他似乎被困在了DoWork方法上,或者RunWorkerCompleted没有被解雇,你们能看到这里有什么不对劲吗 也许我没有正确地实现这一点:/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

嘿,我有一个测试后台工作人员,他似乎被困在了DoWork方法上,或者RunWorkerCompleted没有被解雇,你们能看到这里有什么不对劲吗

也许我没有正确地实现这一点:/

 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();
                }
            }
        }
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用MailChimp;
使用系统线程;
使用System.Runtime.InteropServices;
名称空间黑猩猩传输器
{
公共部分类Form1:Form
{
//工作线程标志设置为false
静态布尔完成=错误;
//控制台dll
[DllImport(“Kernel32.dll”)]
静态外部布尔alloconsole();
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
}
私有无效标签1_单击(对象发送方,事件参数e)
{
}
私有无效帐户信息工具StripMenuItem\u单击(对象发送者,事件参数e)
{
//loadWindow pleaseWait=新建loadWindow();
//请把它显示出来;
BackgroundWorker bg=新的BackgroundWorker();
bg.DoWork+=新DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bg\u RunWorkerCompleted);
bg.RunWorkerAsync();
而(!完成)
{
//WriteLine(“在Main中等待,tid”+Thread.CurrentThread.ManagedThreadId);
//睡眠(100);
}
//AccountInfo accInfo=新AccountInfo();
//accInfo.Show();
}
public void bg_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
如果(!alloconsole())
{
WriteLine(“Fnished!”+Thread.CurrentThread.ManagedThreadId);
}
完成=正确;
}
公共无效bg_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i在(!done)
时取出你的
。它正在锁定主线程。工作线程已完成事件在该线程上引发,但由于它在循环中忙碌,因此永远不会引发该事件


RunWorkerCompleted事件的整个要点是,您可以在主线程上收到通知,而不必将其锁定在繁忙的循环中,使gui没有响应。

Hmm我的输出第三个控制台线程id,然后卡住,我的PC风扇声音更大:我看到三条“工作线”,然后是“完成”(,我会成为一个更好的编码员吗:(.谢谢大家:)