【问题标题】:Pass variable to RunWorkerCompleted() after DoWork() is doneDoWork() 完成后将变量传递给 RunWorkerCompleted()
【发布时间】:2016-12-02 14:17:02
【问题描述】:

我正在使用 VS 2015 winform 后台工作人员执行一些任务。

我有使用List<string> myListDoWork() 方法,一旦某个过程完成,它就会删除列表中的每个条目。我的目标是让用户知道myList 中的哪个条目没有被处理(因为它会在每个进程之后删除一个条目,所以最后剩下的就是未处理的条目)。为此,我打算将myList 变量传递给RunWorkerCompleted(),但我不仅不知道该怎么做,我什至不确定这是否是最好的方法。

有没有更好的方法让用户知道myList 中的哪个条目没有被处理,如果没有,我如何将变量从 DoWork() 传递给 RunWorkerCompleted()?

当前的 RunWorkerCompleted() 方法:

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Error != null)
    {
        MessageBox.Show(e.Error.ToString());
    }
    else
    {
        MessageBox.Show("Done!");
    }
}

基本上,我希望 MessageBox 在完成运行任务时显示哪些条目未处理

【问题讨论】:

  • 有什么理由不使用 async/await 而不是后台工作人员,因为这是推荐的方法?
  • 我是初学者,所以我并不完全了解其中的区别,但我认为异步适用于基于 Web 的应用程序。我的是离线winform(比如没有网络连接,不使用服务器)
  • @djskj189 async 对于任何处理异步操作的应用程序来说都是一个有用的工具。如果你有异步操作,你可以使用它。
  • @PeterBons 后台工作人员是一种在您进行后台工作时获得 UI 反馈的方法。你不能(很容易)用 async 和 await 做到这一点
  • @Emad 你绝对可以在不使用 BGW 的情况下做到这一点。您可以简单地使用 Progress 实例。

标签: c# winforms visual-studio backgroundworker


【解决方案1】:

你可以使用RunWorkerCompletedEventArgs的结果

this

对于一些不想阅读的人来说,可以使用这个

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    //Do your work
    e.Result = mylist;
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Error != null)
    {
        MessageBox.Show(e.Error.ToString());
    }
    else
    {
        ShowResult(e.Result as List<string>);
    }
}

【讨论】:

  • 请发布代码示例。链接消失了,但人们仍然会来这里寻求答案。
  • 它如何知道哪个“结果”是 myList 变量?它还使用其他变量,它不像它有返回类型
  • @Archer 答案不依赖于链接。
  • @djskj189 结果是你传入的任何内容。如果你传入一个列表,结果会得到一个列表。如果你传入别的东西,它就会得到别的东西。
  • @Archer 是的,无论如何,恭喜自己欺负某人破坏了一个有机会实际学习如何解决问题的人的良好可教时刻,以及如何只有代码可以复制粘贴没有理解,都是因为您甚至不了解网站自己的指南是什么不是答案,并认为在答案末尾添加链接会以某种方式使其不再是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多