【问题标题】:C# Background Worker DoWork getting stuckC# 后台工作人员 DoWork 卡住了
【发布时间】:2012-10-20 10:37:21
【问题描述】:

嘿,我有这个测试后台工作人员,它似乎卡在 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();
                }
            }
        }

【问题讨论】:

  • 嗯,我的输出第三个控制台线程 id,然后卡住了,我的 PC 风扇声音更大了:S
  • 我看到三个“工作线”,然后是“完成”。

标签: c# .net winforms backgroundworker


【解决方案1】:

把你的while (!done) 拿出来。它正在锁定主线程。 worker 完成事件在该线程上引发,但由于它在循环中忙,因此永远不会引发。

RunWorkerCompleted 事件的重点是让您在主线程上收到通知,而不必将其锁定在繁忙的循环中并使您的 gui 无响应。

【讨论】:

  • 傻我:(,我会成为一个更好的编码员吗:(。非常感谢大家:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多