Chr*_*ris 6 .net c# multithreading
自2008年圣诞节以来,我一直在研究同一个项目.我被要求从控制台应用程序(只打印跟踪语句)中将它从完整的Windows应用程序中取出.当然,那没关系.唯一的问题是应用程序的某些部分可能需要几分钟到几乎一个小时才能运行.我需要多线程来显示用户状态或错误.但我不知道从哪里开始.
我已经在WPF中构建了一个小UI.这是非常基本的,但我想根据需要扩展它.该应用程序通过选择源,选择目标,然后单击开始来工作.我希望随着流程的进行更新列表框.与SQL Server安装的方式大致相同,每个步骤在完成时都会根据其名称生成绿色复选标记.
新手如何开始多线程?我应该查看哪些图书馆?任何建议将不胜感激.
ps我正在阅读这个库,http://www.codeplex.com/smartthreadpool
@Martin:这是我的应用程序的构建方式:
我使用从LINQ到ADO.NET的所有内容来获取数据,转换它,然后输出它.
我的主要要求是我想更新我的UI以指示进度
@Frank:如果后台工作程序中的某些内容抛出异常(已处理或以其他方式)会发生什么?我的申请如何收到通知?
@Eric Lippert:是的,我现在在调查.在我复杂化之前.
如果您需要更多信息,请告诉我.目前我已经从单元测试运行这个应用程序,所以我想callig它是一个控制台应用程序是不正确的.我使用Resharper来做到这一点.我是现在唯一使用该应用程序的人,但我想要一个更具吸引力的界面
我不认为您指定了正在使用的CLR的版本,但您可以查看" BackgroundWorker "控件.这是实现多个线程的简单方法.
最好的部分是,它是CLR 2.0及更高版本的一部分
更新以响应您的更新:如果您希望能够更新UI中的进度 - 例如在进度条中 - 后台工作人员是完美的.它使用我认为被称为的事件:ProgressChanged来报告状态.它非常优雅.另外,请记住,您可以拥有所需的实例数,并且可以同时执行所有实例(如果需要).
回答您的问题:您可以轻松设置示例项目并测试您的问题.我确实在这里找到了以下内容(在备注中,谨慎的第2段):
如果操作引发了代码无法处理的异常,则BackgroundWorker会捕获异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,它作为System.ComponentModel .. ::.RunWorkerCompletedEventArgs的Error属性公开.
对于线程新手来说,最好的方法可能是线程池。我们可能需要更多地了解这些部分才能提出更深入的建议
编辑::
由于我们现在有了更多信息,我将坚持之前的答案,看起来您有大量任务需要执行,执行大量任务的最佳方法是将它们添加到线程池,然后继续检查它们是否已完成,如果任务需要按特定顺序完成,那么您只需在前一个任务完成后添加下一个任务即可。线程池确实非常适合这种事情,我认为在这种情况下没有理由不使用它
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |