我的应用程序中有一些WinForms。
在某种形式上,我正在加载其他需要显示大量数据的表单。
因此,当我点击按钮加载这些表格时,他们需要9-10秒才能加载
我改善了这一点。我听说过后台线程,但不知道如何使用它。
按钮上的方法单击我应该做什么,以便我可以看到我的表单,并且处理是由后台线程完成的?
请引导我,以便我可以改进我的用户界面。
答案 0 :(得分:0)
BackgroundWorker易于使用。主要是你订阅DoWork活动,这是你将你的工作放在一个单独的线程中的地方。您还订阅了RunWorkerCompleted事件。当您的DoWork完成时,这将得到提升。 在这种方法中,您只需绑定DoWork方法提取的数据。
您可以使用DoWork事件阵列在DoWork和RunWorkerCompleted之间传递数据。 您也可以取消工作,也可以使用RunWorkerCompleted eventArg从DoWork获取数据,还可以检查Error属性以进行异常处理。
如果您有大量数据,则可以使用批处理流程来获取每批数据并将其显示在UI中。您可以显示将获取的总记录数量,并且已经加载了1000个中的100个,已经加载了1000个中的200个等,以便让用户知情。您还可以提供“取消”选项,以便用户可以停止提取。
在按钮单击中,您只需调用myBackgroundWorker.RunWorkerAsync()即可。 这将调用您的DoWork Handler,它将在一个单独的线程中完成而不是主UI线程,因此您的UI在后台工作者DoWork期间不会冻结。
后台工作人员也支持报告进度。
答案 1 :(得分:0)
让表单立即显示,应该相当简单,并且您不需要后台线程来执行此操作。
我的猜测是,您在加载表单之前检索所有数据,或者您正在检索加载表单的同一线程上的数据。您应该能够使用所需的数据调用表单来检索其余数据(例如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
)的好处是,它旨在与控件配合使用。
答案 2 :(得分:0)
如果您的问题是冻结的主要形式,您需要的是在分离的线程上收集数据,而不是主窗体正在运行。
为此,您可以这样做:
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;
}