我的应用程序中有一些WinForms。
在一些表单上,我正在加载其他表单,这些表单有很多数据要显示。
所以当我点击一个按钮来加载这些表格时,需要9-10秒的时间来加载,
我想改善这一点。我听说过后台线程,但不知道如何使用它。
在按钮上单击意味着我应该做什么才能看到我的表单,并且处理是由后台线程完成的?
请指导我,以便我可以改善我的UI。
发布于 2010-11-26 04:23:19
让窗体立即显示应该是相当简单的,并且不需要后台线程。
我的猜测是,您是在加载表单之前检索所有数据,还是在加载表单的同一线程上检索数据。您应该能够使用检索其余数据(如ID)所需的数据调用表单。
然后,您只需要找到一种方法,使数据处理在创建表单的线程之外的线程上进行。
这可能不是最优雅的解决方案,但它可以完成工作。它使用System.Windows.Forms.Timer
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
//fill controls with data
}如果您有多个要检索的数据集,则可能需要考虑设置一个任务队列来检索每个集。
你怎么做都行。确保禁用任何在未加载数据时可能导致错误的按钮(或其他ui)。
编辑:需要注意的是,winform控件并不总是能很好地处理线程。System.Windows.Forms.Timer (与System.Timers.Timer相对)的优点在于,它可以很好地处理控件。
发布于 2010-11-26 04:23:13
BackgroundWorker很容易使用。主要是订阅DoWork事件,这是您将在单独线程中完成的工作的位置。您还可以订阅RunWorkerCompleted活动。这将在您的DoWork完成时引发。在此方法中,您只需绑定由DoWork方法获取的数据。
您可以使用DoWork事件参数在DoWork和RunWorkerCompleted之间传递数据。您还可以取消工作,还可以使用RunWorkerCompleted eventArg从DoWork中获取数据,还可以检查Error属性以进行异常处理。
如果您有大量数据,您可以使用批处理过程,以获取每个批处理的数据并将其显示在您的UI中。您可以显示将获取的记录总数和进度,1000条记录中的100条已加载,1000条记录中的200条已加载,等等,以便随时通知用户。您还可以提供一个取消选项,这样用户就可以停止获取。
在单击按钮时,您只需调用myBackgroundWorker.RunWorkerAsync()。这将调用你的DoWork处理程序,这将在一个单独的线程中完成,而不是主UI线程,这样你的UI就不会在后台工作者DoWork期间冻结。
后台工作人员还支持报告进度。
发布于 2010-11-26 04:43:59
如果您的问题是主窗体冻结,那么您需要的是在主窗体运行时收集单独线程上的数据。
要实现这一点,您可以这样做:
BackgroundWorker worker;
public Form1()
{
InitializeComponent();
worker = new BackgroundWorker();
}
private void button1_Click(object sender, EventArgs e)
{
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
//Collect data and open your second form here;
}https://stackoverflow.com/questions/4280467
复制相似问题