我有一个Windows窗体应用程序
,在该应用程序上我需要使用一个for循环,该循环具有大约2000-3000个调用的大量远程调用,

,并且在执行for循环时,我松开了表单控件和表单控件上的控件,因为它是一个很大的过程,有时会显示“无响应”,但是如果我等了很长时间,它又回来了,我想我需要为此使用一些线程模型,有什么想法吗,我该如何解决该问题?

评论

将Application.DoEvents()放入循环中。

@ i486-永远不会调用DoEvents()。在代码中引入难以解决的错误是一种邪恶的方法。

@Enigmativity“从没有”?谁这么说的更好的建议是“从不使用.Net”,而不是关于DoEvents()。

#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是最简单的方法。

#3 楼

显然,您需要使用后台线程。建议您阅读这本免费的电子书。