C# Runworker完全触发过快

C# Runworker完全触发过快,c#,.net,events,backgroundworker,C#,.net,Events,Backgroundworker,我得到了一些非常简单的代码,但无法让它工作。我在用BackgroundWorker。问题是RunWorkerCompleted以快速方式启动。运行后,我立即收到消息“工作已完成”,但应用程序仍冻结了几秒钟,如“数据类型数据=新数据类型(路径);”贝恩被处决了。之后,我正确填写了所有DataGridView等。如果我用Thread.Sleep替换这一行,一切看起来都很好。有什么想法吗 public frmWindow(string path) { Initialize

我得到了一些非常简单的代码,但无法让它工作。我在用BackgroundWorker。问题是RunWorkerCompleted以快速方式启动。运行后,我立即收到消息“工作已完成”,但应用程序仍冻结了几秒钟,如“数据类型数据=新数据类型(路径);”贝恩被处决了。之后,我正确填写了所有DataGridView等。如果我用Thread.Sleep替换这一行,一切看起来都很好。有什么想法吗

    public frmWindow(string path)
    {
       InitializeComponent();
       DataType d;
       backgroundWorker1.RunWorkerAsync(path);
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       string path = e.Argument as string;
       DataType data = new DataType(path);
       e.Result = data;            
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
       d = e.Result as DataType;
       MessageBox.Show("Work completed");
    }

使用Debug.Write而不是MessageBox.Show来显示方法的输入和退出时间,怎么样

虽然这个相同的后台线程可以作用于您的UI,但这几乎总是不好的——UI不是线程安全的

BackgroundWorker backGroundWorker1;
        public frmWindow(string path)
        {
            InitializeComponent();
            DataType d;

            backGroundWorker1 = new BackgroundWorker();

            backGroundWorker1.DoWork += (s, e) =>
            {
                System.Diagnostics.Debug.Write("Work started at: " + DateTime.Now + Environment.NewLine);
                string path = e.Argument as string;
                DataType data = new DataType(path);
                e.Result = data;
            };

            backGroundWorker1.RunWorkerCompleted += (s, e) =>
            {
                d = e.Result as DataType;
                System.Diagnostics.Debug.Write("Work completed at: " + DateTime.Now + Environment.NewLine);
            };

            backGroundWorker1.RunWorkerAsync();

        }

使用Debug.Write而不是MessageBox.Show来显示方法的输入和退出时间,怎么样

虽然这个相同的后台线程可以作用于您的UI,但这几乎总是不好的——UI不是线程安全的

BackgroundWorker backGroundWorker1;
        public frmWindow(string path)
        {
            InitializeComponent();
            DataType d;

            backGroundWorker1 = new BackgroundWorker();

            backGroundWorker1.DoWork += (s, e) =>
            {
                System.Diagnostics.Debug.Write("Work started at: " + DateTime.Now + Environment.NewLine);
                string path = e.Argument as string;
                DataType data = new DataType(path);
                e.Result = data;
            };

            backGroundWorker1.RunWorkerCompleted += (s, e) =>
            {
                d = e.Result as DataType;
                System.Diagnostics.Debug.Write("Work completed at: " + DateTime.Now + Environment.NewLine);
            };

            backGroundWorker1.RunWorkerAsync();

        }

您在什么时候更新UI?代码中不清楚。如果应用程序挂起,它很可能位于UI线程上,例如,填充gridview的部分,它可能在后台工作程序之外运行。当您谈到RunWorkerCompleted时,您提到DoWork中的一行-这是什么?
之后,我正确填写了所有DataGridView等
。因此,填充网格需要时间,而不是DoWork()方法。RobJohnson-以上代码是新表单的一部分,在用户选择要处理的文件后显示。它有进度条之类的东西,当它完成处理后,它会将数据类型返回到主窗体。收到主窗体后,继续进行UI更新。总而言之:我在主窗体上选择文件,然后显示带有BackgroundWorker的新窗体。在启动RunWorkerCompleted(我可以看到消息框)后,辅助表单立即关闭,主表单冻结15秒,然后我会用加载的数据更新UI。嗯,可能会在“do work”和“run worker completed”方法中添加断点,并确切地看到发生了什么。如果完成的方法中的断点在您仍在执行“DoWork”时被击中,则这些事件处理程序的分配方式有问题。否则,它应该让您清楚地了解到底发生了什么,可能是“新数据类型(路径)”正在立即执行,或者触发了一个新线程或其他东西。您在什么时候更新UI?代码中不清楚。如果应用程序挂起,它很可能位于UI线程上,例如,填充gridview的部分,它可能在后台工作程序之外运行。当您谈到RunWorkerCompleted时,您提到DoWork中的一行-这是什么?
之后,我正确填写了所有DataGridView等
。因此,填充网格需要时间,而不是DoWork()方法。RobJohnson-以上代码是新表单的一部分,在用户选择要处理的文件后显示。它有进度条之类的东西,当它完成处理后,它会将数据类型返回到主窗体。收到主窗体后,继续进行UI更新。总而言之:我在主窗体上选择文件,然后显示带有BackgroundWorker的新窗体。在启动RunWorkerCompleted(我可以看到消息框)后,辅助表单立即关闭,主表单冻结15秒,然后我会用加载的数据更新UI。嗯,可能会在“do work”和“run worker completed”方法中添加断点,并确切地看到发生了什么。如果完成的方法中的断点在您仍在执行“DoWork”时被击中,则这些事件处理程序的分配方式有问题。否则,它应该让您清楚地了解到底发生了什么,也许“新数据类型(路径)”正在立即执行或触发新线程或其他东西。