c# – winforms应用程序中的多线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – winforms应用程序中的多线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3318字,纯文字阅读大概需要5分钟。
内容图文
![c# – winforms应用程序中的多线程](/upload/InfoBanner/zyjiaocheng/816/902d01696d664f9c8fe3724ab8cf2dfb.jpg)
我正在编写一个win表单,使用报表查看器创建多个PDF文件.这些PDF文件分为4个主要部分,每个部分负责创建特定报告.这些进程创建的文件最少为1个,最多为用户数(目前为50个).
该程序已经存在,依次使用4种方法.为了提高用户数量的额外性能,我想在4个独立的线程中将这些方法与邮件进程分开.
虽然我是使用C#进行多线程处理的新手,但我读了很多文章如何实现这一点.我唯一不确定的是我应该从哪个方向开始.当我阅读多篇博文时,我不确定是否要使用4个独立的线程,一个线程池或多个后台工作者. (或者并行编程应该是最好的方法吗?).博客文章告诉我,如果超过3个线程使用线程池,但另一方面告诉我如果使用winforms,请使用backgroundworker.哪个选项最好(以及为什么)?
最后,我的主线程必须等待所有进程结束才能继续.
有人能告诉我什么是我的问题的最佳解决方案.
*编辑后的额外信息*
我忘了告诉(在我读了你的评论和可能的解决方案之后).这些方法只共享一个“IEnumerable”用于阅读.在触发方法(不必按顺序运行)之后,这些方法会触发用于向UI发送状态更新的事件.我认为使用单独的线程即使不是不可能也很难触发事件,因此在运行时应该有某种回调函数来报告状态更新.
psuedo代码中的一些示例.
main()
{
private List<customclass> lcc = importCustomClass()
export.CreatePDFKind1.create(lcc.First(), exportfolderpath, arg1)
export.CreatePDFKind2.create(lcc, exportfolderpath)
export.CreatePDFKind3.create(lcc.First(), exportfolderpath)
export.CreatePDFKind4.create(customclass2, exportfolderpath)
}
namespace export
{
class CreatePDFKind1
{
create(customclass cc, string folderpath)
{
do something;
reportstatus(listviewItem, status, message)
}
}
class CreatePDFKind2
{
create(IEnumerable<customclass> lcc, string folderpath)
{
foreach (var x in lcc)
{
do something;
reportstatus(listviewItem, status, message)
}
}
}
etc.......
}
解决方法:
从您描述的基本图片中,我将使用Task Paralell Library (TPL).随.NET Framework 4.0一起提供.
您谈到在生成大量到中等数量的线程时使用线程池的“最佳”选项.尽管这是正确的[最有效的资源管理方式],但TPL会为您完成所有这些 – 而不必担心任何事情. TPL也使用多个线程并等待完成它们…
为了满足您的需求,我将使用TPL和Continuations.继续不仅允许您创建任务流,还可以处理您的异常.这是TPL的great introduction.但是要给你一些想法……
您可以使用启动TPL任务
Task task = Task.Factory.StartNew(() =>
{
// Do some work here...
});
现在,当先前任务完成(错误或成功)时,您可以使用ContinueWith方法启动第二个任务
Task task1 = Task.Factory.StartNew(() => Console.WriteLine("Antecedant Task"));
Task task2 = task1.ContinueWith(antTask => Console.WriteLine("Continuation..."));
因此,只要task1完成,失败或被取消,task2’就会启动’并开始运行.请注意,如果task1在到达第二行代码之前已完成,则task2将被安排立即执行.传递给第二个lambda的antTask参数是对前一个任务的引用.有关详细示例,请参阅this link …
您还可以传递先行任务的延续结果
Task.Factory.StartNew<int>(() => 1)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask =>Console.WriteLine(antTask.Result * 4)); // Prints 64.
注意.请务必在提供的第一个链接中阅读异常处理,因为这可能会导致TPL的新手误入歧途.
最后要特别注意你想要的是儿童任务.子任务是创建为AttachedToParent的任务.在这种情况下,在所有子任务完成之前,延续不会运行
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { SomeMethod() }, atp);
Task.Factory.StartNew(() => { SomeOtherMethod() }, atp);
}).ContinueWith( cont => { Console.WriteLine("Finished!") });
因此,在您的情况下,您将启动您的四个任务,然后在主线程上等待完成.
我希望这有帮助.
内容总结
以上是互联网集市为您收集整理的c# – winforms应用程序中的多线程全部内容,希望文章能够帮你解决c# – winforms应用程序中的多线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。