将方法传递给后台工作者 dowork

2023-12-01

在下面的代码中,有没有一种方法可以不总是订阅 updateWorker_DoWork 方法,而是向其传递这样的方法

public void GetUpdates(SomeObject blah)
{
    //...
    updateWorker.DoWork += new DoWorkEventHandler(blah);
    //...
}


public void GetUpdates()
{
    //Set up worker
    updateWorker.WorkerReportsProgress = true;
    updateWorker.WorkerSupportsCancellation = true;
    updateWorker.DoWork += new DoWorkEventHandler(updateWorker_DoWork);
    updateWorker.RunWorkerCompleted +=
        new RunWorkerCompletedEventHandler(updateWorker_RunWorkerCompleted);
    updateWorker.ProgressChanged +=
        new ProgressChangedEventHandler(updateWorker_ProgressChanged);

    //Run worker
    _canCancelWorker = true;
    updateWorker.RunWorkerAsync();
    //Initial Progress zero percent event
    _thes.UpdateProgress(0);
}

为您RunWorkerAsync()你可以传递任何你喜欢的论点。你可以只放一个Func() or Action()进入它并在你的DoWork()您只需将对象强制转换回该特定类型并调用它即可。

例子是here and here.

private void InitializeBackgroundWorker()
{
    _Worker = new BackgroundWorker();

    // On a call cast the e.Argument to a Func<TResult> and call it...
    // Take the result from it and put it into e.Result
    _Worker.DoWork += (sender, e) => e.Result = ((Func<string>)e.Argument)();

    // Take the e.Result and print it out
    // (cause we will always call a Func<string> the e.Result must always be a string)
    _Worker.RunWorkerCompleted += (sender, e) =>
    {
        Debug.Print((string)e.Result);
    };
}

private void StartTheWorker()
{
    int someValue = 42;

    //Take a method with a parameter and put it into another func with no parameter
    //This is called currying or binding
    StartTheWorker(new Func<string>(() => DoSomething(someValue)));

   while(_Worker.IsBusy)
       Thread.Sleep(1);

   //If your function exactly matches, just put it into the argument.
   StartTheWorker(AnotherTask);
}

private void StartTheWorker(Func<string> func)
{
    _Worker.RunWorkerAsync(func);
}

private string DoSomething(int value)
{
    return value.ToString("x");
}

private string AnotherTask()
{
    return "Hello World";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将方法传递给后台工作者 dowork 的相关文章

随机推荐

  • 如何解决与 Windows 10 上安装 dlib 相关的问题?

    我正在尝试在 Windows 10 上为 python 3 7 安装 dlib 以进行人脸识别 我探索了几种方法 但遇到了错误 我尝试了以下步骤 使用 pip install cmake 安装了 cmake 这奏效了 从 Python 包索
  • 如何使用多个配置构建同一项目 C# VisualStudio2012

    我有很多项目的解决方案 我想构建多个具有多个配置设置的项目 e g ProjectA 设置为目标框架 3 5 和平台目标 x86 输出程序集名称是 ProjectA dll 我想在单击构建按钮时在多个输出文件中构建项目 ProjectA 3
  • Java 8 Lambda 表达式——方法重载疑惑

    我正在尝试学习 Lambda 表达式 interface MathOperartor对于 int 和 float 类型 operate 已重载 我确信这应该可以使用 Lambda 表达式来完成 但似乎不太清楚问题出在哪里 public st
  • Quartz.net 和 Common.Logging - 使用 Log4Net

    我在 Windows 服务中使用 Quartz net 目前 触发器没有触发 我想使用日志记录来找出原因 我已经编辑了 Windows 服务的配置文件
  • .htaccess 将所有流量重定向到一页(410 消失)

    我们有一个即将关门的客户 我们希望将进入其域的所有流量重定向到新页面index html 并在 img 子目录中包含一些图像 该页面解释了发生的情况 当前客户对当前订单的期望等 我读过有关可能使用 HTTP 410 Gone 作为从技术上向
  • Python 3.4 中的 YouTube API UnicodeEncodeError

    我正在探索 YouTube 数据 API 发现编码不正确的结果阻碍了我 在检索到标题中包含未映射字符的集合之前 我得到了很好的结果 我的代码现在是 为你们好人清理了一点 import urllib request import urllib
  • WPF 应用程序中的 AxWindowsMediaPlayer 大小

    我正在使用一个AxWindowsMediaPlayer in a WindowsFormsHost在 WPF 应用程序中 我在调整控件大小时遇到 问题 我需要隐藏视频部分 只保留带有按钮和搜索栏的部分 因为我运行音频 我需要调整Window
  • firefox document.getElementById 只获取第一个复选框?

    这个简单的代码检查是否至少标记了一个复选框 当我尝试使用 Firefox 获取复选框数组时 我没有 我只是第一个 相同的代码在 IE 中运行良好 我是否需要为复选框元素创建不同的 ID 并迭代它们 感谢您的帮助
  • 反转字母表

    我正在尝试修改一段文本以应用以下翻译 before abcdefghijqlmnopqrstuvwxyz after zyxwvutsrqponmlkjihgfedcba 也就是说 每个a成为一个z each b成为一个y each c成为
  • 为什么不鼓励在 Java EE 容器中生成线程?

    关于 Java EE 开发 我学到的第一件事就是我不应该在 Java EE 容器内生成自己的线程 但转念一想 我又不知道原因 你能清楚地解释一下为什么不鼓励吗 我确信大多数企业应用程序都需要某种异步作业 例如邮件守护程序 空闲会话 清理作业
  • 为什么有序列表的 sapply 会输出我的内容两次

    我使用以下代码将文件列表存储在列表中 filesList lt list files path Users myPath data pattern csv 然后我想在没有索引的情况下输出它 通常以形式出现 1 在每一行的开头 所以我尝试了这
  • R 中的环境、mapply 和 get

    Let x lt 2在全局环境中 x lt 2 x 1 2 Let a是一个定义另一个函数的函数x本地并使用get a lt function x lt 1 get x 该函数正确得到x从当地环境来看 a 1 1 现在我们定义一个函数b如下
  • Fluentd apache 格式 [警告]:模式不匹配:

    在我的 etc Fluent Fluent conf 中
  • 如何在不使用 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件

    我想保存并加载InkCanvas gif文件没有FilePicker I saw a sample using FilePicker 但我想保存gif当我单击 保存 按钮时自动文件 例如 当我保存 1InkCanvas gif file 然
  • 安装 PyOpenGLContext 时出现问题(语法错误)

    我最近决定用 python 学习 OpenGL 我使用安装了 PyOpenGLpip3 install PyOpenGl PyOpenGl accelerate 然后我正要遵循一个教程对于 PyOpenGL 第一项是安装 PyOpenGLC
  • 带有垂直行的 HTML 表格

    如何在 HTML 中制作垂直表格 垂直 我的意思是行将垂直 表标题位于左侧 我还需要它的方式 这样我就可以像在普通表中一样访问这些行 在本例中是垂直的 tr 这是因为我动态获取一行的数据 如 A 行 并将其插入表中 我使用 angularJ
  • 将时间格式设置为“24 小时军用时间”?

    我正在将一些 SQL Server 2000 代码更新到 SQL Server 2008R2 并且有一个看起来很像的函数this用于将时间转换为 24 小时格式 在 T SQL 中执行此操作的更酷 更聪明的方法是什么 如果你想要的只是军事时
  • 对不同类型对象的列表进行排序

    我有一个对象列表 其中包含不同类型的对象 但单个属性在所有对象中都是通用的 列表包含 Field 类 Button 类 Page 类等对象 但其中一个属性是通用的 即 sequence no 我想根据 sequence no 对该列表进行排
  • NPM 包错误 - 'newman' 未被识别为内部或外部命令

    我已在我的 64 位 Win 10 计算机中安装了最新版本的 Newman 3 10 0 C Users ABC gt npm install g newman C Users ABC AppData Roaming npm newman
  • 将方法传递给后台工作者 dowork

    在下面的代码中 有没有一种方法可以不总是订阅 updateWorker DoWork 方法 而是向其传递这样的方法 public void GetUpdates SomeObject blah updateWorker DoWork new