在DoWork()完成后将变量传递给RunWorkerCompleted()

6

我正在使用VS 2015 winform后台工作线程来执行一些任务。

我有一个DoWork()方法,它使用List<string> myList,并在完成某个过程后删除列表中的每个条目。我的目标是让用户知道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显示未处理的条目。

我是一个初学者,所以我不太清楚区别,但我认为异步是用于基于Web的应用程序。我的应用程序是离线Winform(例如没有网络连接,不使用服务器)。 - djskj189
@djskj189 async 是任何处理异步操作的应用程序中非常有用的工具。如果您有一个异步操作,可以使用它。 - Servy
@PeterBons 背景工作者是在进行后台工作时提供UI反馈的一种手段。使用异步和等待很难做到这一点。 - Emad
@Emad 这是我的情况。在过程中不断更新UI以报告正在发生的事情。 - djskj189
1
@Emad您完全可以不使用BGW来完成这个任务。您可以简单地使用Progress实例。 - Servy
显示剩余3条评论
1个回答

22
你可以使用 RunWorkerCompletedEventArgs 的结果。
查看这里
对于一些不想阅读的人,可以使用此方法。
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>);
    }
}

5
请提供一个代码示例。链接可能会失效,但人们仍然会来这里寻找答案。 - Reinstate Monica Cellio
它怎么知道哪个“result”是myList变量?它还使用其他变量,而且不像它有返回类型。 - djskj189
@Archer 答案不取决于链接。 - Servy
@Archer 答案从来不只是一个链接。即使在帖子中没有包含链接,它仍然可以成为答案。在答案末尾添加链接并不会使其停止成为答案。 - Servy
1
@Archer 是的,尽管如此,请恭喜自己欺负别人,毁掉了一个有机会真正学习如何解决问题的教育时刻,只因为你甚至不理解该网站自己的指南是什么,以及认为在答案末尾添加链接就可以使其停止成为答案。现在只剩下抄袭粘贴代码而没有理解了。 - Servy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接