,在该应用程序上我需要使用一个for循环,该循环具有大约2000-3000个调用的大量远程调用,
,并且在执行for循环时,我松开了表单控件和表单控件上的控件,因为它是一个很大的过程,有时会显示“无响应”,但是如果我等了很长时间,它又回来了,我想我需要为此使用一些线程模型,有什么想法吗,我该如何解决该问题?
#1 楼
您需要在后台线程上执行长时间运行的操作。执行此操作的方法有多种。
您可以将方法排队要求在线程池线程上执行(请参见此处):
ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod));
在.NET 4.0中,您可以使用TaskFactory:
Task.Factory.StartNew(() => YourMethod());
在.NET 4.5和更高版本中,您可以(并且应该而不是
TaskFactory.StartNew()
)使用Task.Run()
:Task.Run(() => YourMethod());
您可以使用BackgroundWorker如果需要进度更新或完成时发出通知等信息,则可以更好地控制该方法。将BackgroundWorker控件拖到窗体上,然后将方法附加到dowork事件。然后,当您要运行方法时,只需启动工作程序即可。当然,您可以从代码中手动创建BackgroundWorker,只是要记住,完成时需要处理它。
创建一个全新的线程来完成您的工作。除非您需要对线程进行非常细粒度的控制,否则这是最复杂的,并且不是必需的。如果要了解这一点,请参见Thread类的MSDN页面。
请记住,使用任何线程,您都无法更新GUI,也不能从后台线程更改任何GUI控件。如果要在GUI上执行任何操作,则必须使用Invoke(和InvokeRequired)在GUI线程上触发该方法。见这里。
评论
我认为这对我有帮助,我将尝试BackGroundWorker!
– shahjapan
09年8月1日在15:22
#2 楼
private voidForm_Load(object sender, EventArgs e)
{
MethodInvoker mk = delegate
{
//your job
};
mk.BeginInvoke(callbackfunction, null);
}
private void callbackfunction(IAsyncResult res)
{
// it will be called when your job finishes.
}
使用MethodInvoker是最简单的方法。
评论
将Application.DoEvents()放入循环中。@ i486-永远不会调用DoEvents()。在代码中引入难以解决的错误是一种邪恶的方法。
@Enigmativity“从没有”?谁这么说的更好的建议是“从不使用.Net”,而不是关于DoEvents()。