当前位置: 首页 > 知识库问答 >
问题:

C#backgroundworker问题

胡鸿志
2023-03-14

我对C#中的backgroundworker有一个问题。我正在编码一个dll文件。

这是我在VS2019中的类库(.NET Framework)类型项目中的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace States
{    
    public class ST
    {        
        public static void Read()
        {
            BackgroundWorker bgwMessage = new BackgroundWorker();
            bgwMessage.DoWork += new DoWorkEventHandler(BgwFileOpen_DoWork);
            bgwMessage.RunWorkerAsync();
        }
       
        private static void BgwFileOpen_DoWork(object sender, DoWorkEventArgs e)
        {
            MessageBox.Show("Ran");
        }
    }
}

当我使用即时窗口调用read()方法时,后台工作者的doWork方法中的命令不会运行。逐行对问题进行解块显示read()方法正在运行,但它没有以某种方式调用RunworkerAsync。

*Update1:启动线程也不起作用:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TradeStates
{
    
    public class ST
    {
        
        public static void Read()
        {
            Thread thr = new Thread(new ThreadStart(MSGshow));
            thr.Start();
        }
        public static void MSGshow()
        {
            MessageBox.Show("Ran");
        }


    }
}

共有1个答案

郝原
2023-03-14

DoWork事件被激发一次以执行后台工作,并且不能执行任何访问UI控件/UI线程的操作。

您还可以使用另外两个事件。ProgressChanged用于报告进度。例如,您可以实现该方法来更新进度条。另一个,也是我认为您应该感兴趣的是runworkercompleted。在你的情况下你会有

bgwMessage.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(BgwFileOpen_ShowDialog);
...
private void BgwFileOpen_ShowDialog(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Ran");
}

最后的想法

  • 后台工作者通常应是form或其他winforms类的属性,因为backgroundworker继承自component
  • 当后台工作者的父级被释放时,它应该调用后台工作者的dispose()
  • 如果您必须从read()创建并启动worker,我建议您启动一个thread,并在完成时让它向UI线程发送一条消息。然后,您的消息处理程序将启动消息框。

BackgroundWorker类文档提供了如何正确使用该类的一个很好的示例。

 类似资料:
  • 本文向大家介绍C# BackgroundWorker使用教程,包括了C# BackgroundWorker使用教程的使用技巧和注意事项,需要的朋友参考一下 查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作(比如文件下载数据库事

  • 问题内容: (int)faultsGroup为0或1,但我总是收到此错误:列’FaultGroup’不能为null 有人告诉我为什么吗?语法看起来还可以。 问题答案: 我大约六个月没有使用MySql(感谢迁移到Sql Server),但是,请尝试将您的@符号更改为?,就像使用了内存一样,这是MySql的正确约定,因此:

  • 我正在纠结于一个基本的浮点精度问题。问题就在这里: 运行代码得到“否”

  • 亲爱的读者,这些C# Interview Questions专门设计用于让您了解在面试C#时可能遇到的问题的本质。 根据我的经验,很好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的问题 - 什么是C#? C#是由Microsoft开发的一种现代的,通用的,面向对象的编程语言。 C#专为公共语言基础结构(CLI)而设计,它

  • 现在这种情况仍然发生,但很少发生,就像100次碰撞中有1次发生,而在100次碰撞中有20次发生之前

  • 本文向大家介绍C和C++混合编程问题,包括了C和C++混合编程问题的使用技巧和注意事项,需要的朋友参考一下 分析以下一段代码: 调用以上三个文件,编译通过,但是执行是出现以下问题: obj : error LNK2001: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z) E:\Programming\Grapic\test\Debug\te