BackgroundWorker 从外部类报告进度?

2023-12-26

我有一个工作解决方案,可以将进度和文本报告给进度条以及应用程序主窗体上的标签。我现在已将我的工作方法移至一个类,以便可以跨多种形式访问它们等。

在工作方法中是BW.ReportProgress()将进度和文本推回到主窗体中的BackgroundWorker 的语句。

为了更好地理解这里的文件布局:

MainScreen.cs

List repSelected = new List();
XMLandRar xXMLandRar = new XMLandRar();

private void Rarbtn_Click(object sender, EventArgs e)
        {
            GetReps();

            //Run worker
            if (!CreateRarBW.IsBusy)
            {
                CreateRarBW.RunWorkerAsync();
            }
        }

//Worker
private void CreateRarBW_DoWork(object sender, DoWorkEventArgs e)
{
    xXMLandRar.RarFiles(repSelected);
}

//Progress reporting
private void CreateRarBW_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progBar.Value = e.ProgressPercentage;
    Statuslbl.Text = e.UserState.ToString();
}

然后我新创建的类包含所有工作方法,并将进度推向主窗体。

XMLandRar.cs

public class XMLandRar
{
    public void RarFiles(List repSelected)
    {
        int step = 100 / repSelected.Count();
        int i = 0;
        //Iterate through list and run rar for each
        foreach (string rep in repSelected)
        {
            CreateRarBW.ReportProgress(i, "Raring files for " + rep);
            DirectoryExists(rep);
            ProcessRunner(rep);
            i += step;
            CreateRarBW.ReportProgress(i, "Raring files for " + rep);
        }
    }
}

我遇到的问题是在XMLandRarCreateRarBW 类无法识别(显然) - 我怎样才能制作一个ReportProgress在应用程序的主屏幕中调用 BW?


在您的中创建一个事件XMLandRar您可以订阅的课程。

这样一来XMLandRar类不需要知道或关心 UI 或进度条,它只关心发送消息是否有人愿意听。并且也可以有多个订阅者(假设您想向后台工作者和日志报告,也许)

Example:

private void Rarbtn_Click(object sender, EventArgs e)
{
    GetReps();

    //Run worker
    if (!CreateRarBW.IsBusy)
    {
        // This should be done once, maybe in the contructor. Bind to new event.
        xXMLandRar.ReportProgress += new EventHandler<XMLandRar.ProgressArgs>(xXMLandRar_ReportProgress);

        CreateRarBW.RunWorkerAsync();
    }
}

protected void xXMLandRar_ReportProgress(object sender, XMLandRar.ProgressArgs e)
{
    // Call the UI backgroundworker
    CreateRarBW.ReportProgress(e.Percentage, e.Message);
}

public class XMLandRar
{
    // Event handler to bind to for reporting progress
    public EventHandler<ProgressArgs> ReportProgress;

    // Eventargs to contain information to send to the subscriber
    public class ProgressArgs : EventArgs
    {
        public int Percentage { get; set; }
        public string Message { get; set; }
    }

    public void RarFiles(List repSelected)
    {
        int step = 100 / repSelected.Count();
        int i = 0;
        //Iterate through list and run rar for each
        foreach (string rep in repSelected)
        {
            // Report progress if somebody is listening (subscribed)
            if (ReportProgress != null)
            {
                ReportProgress(this, new ProgressArgs { Percentage = i, Message = "Raring files for " + rep });
            }

            DirectoryExists(rep);
            ProcessRunner(rep);
            i += step;

            // Report progress if somebody is listening (subscribed)
            if (ReportProgress != null)
            {
                ReportProgress(this, new ProgressArgs { Percentage = i, Message = "Raring files for " + rep });
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BackgroundWorker 从外部类报告进度? 的相关文章

随机推荐

  • R tryCatch 处理一种错误

    我想知道这是检查 tryCatch 函数类型的错误或警告的方法 例如在 Java 中 try driver findElement By xpath locator click result true catch Exception e i
  • yii2 上的多个数据库连接

    我正在尝试在 yii2 框架上使用多个数据库连接 在 config 文件夹内的 db php 文件下 我有这段代码 return class gt yii db Connection components gt db1 gt class g
  • 退出/完成应用程序/活动 - android

    我有 4 项活动说Act1 Act2 Act3 and Act4 Act1 中的按钮打开 Act2 Act2 中的按钮打开 Act3 Act3 中的按钮打开 Act4 我想要做两件事 我在第 4 幕中有一个按钮 将用户定向到第 1 幕 问题
  • 指向成员函数的指针作为全局函数的参数

    有这样的代码 void foo void fun ptr class B public B foo some fun void some fun 编译错误 error argument of type void B does not mat
  • 在家学习内核黑客和嵌入式开发? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我总是被内核黑客和嵌入式系统的世界所吸引 有没有人有关于开始搞乱这些东西的好教程 容易获得的硬件 诸如
  • Braintree - 自定义 - 在PaymentMethodReceived 上手动提交表单

    你好 很棒的互联网 我正在尝试实施 Braintree 付款 到目前为止一切都很好 我已经成功地实现了具有我自己的外观和感觉的自定义表单 一切都很好 现在 我正在添加对我提交的额外数据的验证 例如运输说明和其他好东西 为了进行验证 我读到我
  • Swing JButton:文本上方的图标

    如何在 Swing 中创建一个图标位于文本上方的 JButton 就这样做 button setVerticalTextPosition SwingConstants BOTTOM button setHorizontalTextPosit
  • 自定义 Twitter Bootstrap 网格不起作用

    我正在尝试制作一个 24 列网格 我计算了这个 网站宽度 997px 列数 24 列宽 31px 装订线宽度 11px 流体柱宽度 3 1093279839519 流体槽宽度 1 1033099297894 这应该可以工作 但是当我将其输入
  • Node.js console.log 与 console.info

    使用有什么好处console log vs console info 或者与此相关的任何其他控制台命令 console info info console error error console warn warn vs console l
  • 函数 registerForActivityResult 不存在

    我已经尝试了互联网上的所有解决方案来解决这个问题 但没有人工作 我正在使用依赖项 implementation androidx appcompat appcompat 1 3 0 beta01 implementation android
  • Nginx 反向代理配置

    我需要 nginx 来反向代理以下形式的 GET 和 POST 请求 myapp path to resource to http 127 0 0 1 9090 path to resource 我正在尝试以下操作 location mya
  • c相当于matlab的sind和cosd函数

    所以我正在将一些 matlab 代码手动转换为 c 代码 我只是想知道是否有一个 c 相当于我在 matlab 代码中看到的 sind 和 cosd 函数 我猜这会返回以度为单位的答案 而不是 c sin 和 cos 函数以弧度给出结果 我
  • Java JList remove() 方法抛出 ArrayOutOfBoundsException

    我正在使用显示正确的 JList 但是 我在从列表中删除元素时遇到问题 JList nameList new JList db getAllNames nameList setVisibleRowCount 6 nameList setFi
  • 寻找监视器与信号量的良好类比/示例

    监视器应该解决并发环境中的信号量问题 我正在寻找使用监视器与信号量的良好类比 请使用信息进行类比 4 个任务 任务S 任务 任务 任务S 1 个变量 varX 每个任务都想根据某个事件来操作varX 假设一群病人想要去看医生 信号量的实现是
  • 如何在 R 中直接显示路径视图图(而不是保存为文件)?

    这是一个示例 输出是一个 png 文件hsa04110 gse16873 png 我的问题是如何直接显示绘图而不是将其保存为文件 library pathview data gse16873 d data demo paths data p
  • 如何创建播放一次并冻结在最后一帧的 GIF 图像

    如何创建播放一次并冻结在最后一帧的 GIF 图像 我已经将循环属性设为1 所以第一个问题就解决了 但是动画结束后 gif 并没有冻结在最后一帧 而是回到第一帧 您需要将 gif 的循环计数更改为 1 这是一个在线工具 可以让您免费做到这一点
  • CActiveForm 和 ajaxSubmitButton 不起作用

    这是我的代码
  • 无法定义元组的类型:目标需要 2 个元素,但源可能更少

    我正在尝试填充一个由元组组成的数组 const countries sg my th const platforms ios android const combinationsToQuery platforms flatMap platf
  • wxWidgets运行时错误(版本不匹配)

    我在启动程序时遇到问题 致命错误 检测到程序和库构建版本之间不匹配 该库使用3 0 wchar t C ABI 1010编译器 wx容器 兼容2 8 并且您的程序使用3 0 wchar t 使用C ABI 1009的编译器 wx容器 与2
  • BackgroundWorker 从外部类报告进度?

    我有一个工作解决方案 可以将进度和文本报告给进度条以及应用程序主窗体上的标签 我现在已将我的工作方法移至一个类 以便可以跨多种形式访问它们等 在工作方法中是BW ReportProgress 将进度和文本推回到主窗体中的Background