2013-10-20 68 views
0

我正在研究大约35批次更新许多数据库,作为我们日常工作过程的一部分。每一批都是在单一的网络应用程序中开发的。由于数据库问题,我已经将它们全部收集在一个Windows应用程序中以利用数据库连接池,并且我为每个批次分配了一个背景工作器。在应用程序中达到20批次,每件事情都很好。但是,当我为任何其他批处理添加其他背景工作时,应用程序挂起。我认为这是因为我在一个进程中运行太多线程。有没有针对这个问题的解决方案,例如,使应用程序与许多进程一起工作?? !!! Regards,winforms应用程序中的多处理

注意, 我已经为此应用程序(Core i7 cpu,8 gb ram)分配了一台机器。

+0

线程的数量应该与您的问题的原因无关。请更具体地说明您的代码在哪里挂起。使用调试器查看程序线程挂起时的状态。如果您确信自己知道哪些是挂起/有问题的代码,请将其发布到此处以便我们提供帮助。 – elgonzo

+0

亲爱的elgonzo,问题是用户界面挂着,我不能最小化或最大化窗口,我不能按任何按钮。我只需要一种方法,让所有这些背景工作者都能更快地执行UI。感谢您的回复。 – user2489259

+0

使用调试器。现在你要求我们在黑暗中捅一捅,然后盲目猜测。也许你有一个僵局,也许你有太多的数据库连接打开,也许有些不同。谁知道...? – elgonzo

回答

0

多少数据库,您必须更新?

我认为这是比较推荐拥有的线程数为数据库的数量

+0

很好的解决方案,但每批都有特定的工作和不同的运行时间。即每30秒运行一次,每5秒运行一次,以此类推。 – user2489259

0

如果在许多背景工作者活跃你的UI被冻结,但恢复时,这些背景的工人很可能是完成处理,然后UI线程正在执行一个方法,该方法等待来自其中一个后台工作线程的结果或信号。

要解决你的问题,你将不得不寻找一个与同步/多线程涉及UI相关的代码。这可能是.NET正在使用的众多同步对象中的一个(包括lock语句)的地方,但它也可能涉及“哑”轮询循环a-ka while(!worker.IsFinished) Thread.Sleep();

另一个可能的原因冻结可能是你在后台线程运行的工人(或工人相关法)偶然在UI线程来代替。

但你会发现当你使用调试器。

为了使您的狩猎范围的可管理问题的方法,让你的程序在调试器中运行,直到UI冻结。此时,在调试器中暂停程序执行。看看UI线程正在处理哪些代码,然后您将找到一个有问题的代码实例。 (不管有错,我不能告诉你 - 因为我不知道你的代码。)

这很可能是在你的代码不同的UI相关的方法将同样的问题受到影响。所以,如果你发现有问题的代码(并且能够修复它),你会想检查其他有问题的方法,但这应该是相当容易的,因为在那个时候你会知道该找什么...