Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程:如何更新UI以指示进度_C#_.net_Multithreading - Fatal编程技术网

C# 多线程:如何更新UI以指示进度

C# 多线程:如何更新UI以指示进度,c#,.net,multithreading,C#,.net,Multithreading,自从2008年圣诞节以来,我一直在做同一个项目。我被要求将它从控制台应用程序(只打印跟踪语句)转换为完整的Windows应用程序。当然可以。唯一的问题是,应用程序的某些部分可能需要几分钟到近一个小时才能运行。我需要多线程来显示用户状态或错误。但我不知道从哪里开始 我已经在WPF中构建了一个小UI。这是非常基本的,但我想根据需要扩展它。该应用程序通过选择源、选择目标并单击开始来工作。我想一个列表框,以更新的过程进行下去。与SQL Server的安装方式大致相同,每个步骤在完成时都会在其名称旁边打上

自从2008年圣诞节以来,我一直在做同一个项目。我被要求将它从控制台应用程序(只打印跟踪语句)转换为完整的Windows应用程序。当然可以。唯一的问题是,应用程序的某些部分可能需要几分钟到近一个小时才能运行。我需要多线程来显示用户状态或错误。但我不知道从哪里开始

我已经在WPF中构建了一个小UI。这是非常基本的,但我想根据需要扩展它。该应用程序通过选择源、选择目标并单击开始来工作。我想一个列表框,以更新的过程进行下去。与SQL Server的安装方式大致相同,每个步骤在完成时都会在其名称旁边打上绿色复选标记


新手是如何开始多线程的?我应该去哪些图书馆借书?如有任何建议,将不胜感激

p、 我现在正在读关于这个图书馆的书

@马丁:以下是我的应用程序的构造:

  • 引擎:按预定义顺序运行所有主要组件
  • Excel:我编写的用于包装COM以打开/阅读/关闭/保存工作簿的库
  • 库:理解不同类型工作簿格式的库(共5个)
  • 业务类:我编写的用于转换Excel数据并为访问做好准备的类
  • Db库:我编写的一个库,它使用ADO.NET读取Access数据
  • AppSettings:你明白了吗
  • Serialier:在应用程序崩溃时保存数据
  • 我使用从LINQ到ADO.NET的所有工具来获取数据、转换数据,然后输出数据

    我的主要要求是,我想更新我的UI以指示进度

    @弗兰克:如果后台工作人员抛出异常(已处理或其他),会发生什么?我的申请如何收到通知

    @埃里克·利珀特:是的,我现在正在调查。在我把事情复杂化之前


    如果你需要更多信息,请告诉我。目前,我正在通过单元测试运行这个应用程序,所以我猜称它为控制台应用程序是不对的。我用Resharper来做这个。我是目前唯一一个使用该应用程序的人,但我想要一个更吸引人的界面

    对于一个全新的线程开发人员来说,最好的方法可能是线程池。我们可能需要更多地了解这些部分,以便提出更深入的建议

    编辑::

    由于我们现在有了更多的信息,我将坚持我之前的回答,看起来你有很多任务需要完成,完成大量任务的最好方法是将它们添加到线程池中,然后继续检查它们是否完成,如果任务需要按特定顺序完成,那么您只需在前一个任务完成时添加下一个任务即可。threadpool对于这类事情来说确实非常好,我认为没有理由不在这种情况下使用它

    我认为您没有指定正在使用的CLR的版本,但是您可以检查“”控件。这是一种实现多线程的简单方法

    最棒的是,它是

    更新以响应您的更新:如果您希望能够在UI中(例如在进度条中)更新进度,则后台工作程序是完美的。它使用一个我认为叫做ProgressChanged的事件来报告状态。它非常优雅。此外,请记住,您可以拥有所需的任意多个实例,并且可以同时执行所有实例(如果需要)

    回答您的问题:您可以轻松设置示例项目并测试您的问题。我确实发现了以下内容(在警告第2段的备注下):

    如果操作引发异常 如果您的代码无法处理 BackgroundWorker捕获异常 并将其传递到 RunWorkerCompleted事件处理程序, 将其作为错误公开的位置 性质 System.ComponentModel.::.RunWorkerCompletedEventArgs

    这是对线程的一个很好的总结


    听上去,你可能不需要任何非常复杂的东西——如果你刚开始任务,然后想知道任务何时完成,你只需要几行代码就可以创建一个新线程并让它运行你的任务。然后你的用户界面线程就可以继续运行,并定期检查任务是否完成。

    是目前关于这个主题的最好的书。由著名的微软多线程专家JoeDuffy撰写。从Windows线程调度程序的工作方式到.NET Parallels Extensions Library,您需要了解的一切和更多信息。

    来自Joseph Albahari的非常好。

    记住创建代理以更新UI,这样您就不会遇到跨线程问题,UI也不会出现冻结/锁定

    此外,如果您需要大量注释/电源点等

    我可以推荐我本科的所有课堂讲稿吗
    杰森的链接是一篇好文章。您需要注意的是,UI只能由主UI线程更新,如果您尝试在工作线程中更新,则会出现跨线程异常。BackgroundWorker控件可以帮助您处理事件,但您还应该了解control.Invoke(或control.Begin/EndInvoke)。这可用于在UI线程的上下文中执行委托

    此外,您还应该了解从不同线程访问相同代码/变量的诀窍,其中一些问题可能会导致间歇性的bug,难以追踪

    需要注意的一点是volatile关键字只保证变量访问的“新鲜度”,例如,它保证变量的每次读写都来自主内存,而不是来自线程或处理器缓存或内存模型的其他“功能”。它不会停止诸如一个线程在读更新写过程中被另一个线程中断之类的问题(例如更改变量值)。这会导致错误,其中2