【发布时间】:2014-04-02 20:47:30
【问题描述】:
我是新手,我从 StackOverflow 学到了很多东西。我最近开始在我的 Windows 应用程序中使用线程。据我所知,多线程让事情变得简单,就像同时做很多事情一样。
我在 SQL 中有存储过程,然后我用几种方法调用。
这是我的代码
private void EditCustomer_Load(object sender, EventArgs e)
{
screenszize_Location();
Thread BackgroundThread = new Thread
(
new ThreadStart(() =>
{
GridCustomerList.BeginInvoke(
new Action(() =>
{
LoadGrid();
}
));
}
));
BackgroundThread.Start();
Thread BackgroundThread1 = new Thread
(
new ThreadStart(() =>
{
ComboBxVechicleNumber.BeginInvoke(
new Action(() =>
{
LoadVnum();
}
));
}
));
BackgroundThread1.Start();
Thread BackgroundThread2 = new Thread
(
new ThreadStart(() =>
{
ComboBxBikeMake.BeginInvoke(
new Action(() =>
{
loadBikeMake();
}
));
}
));
BackgroundThread2.Start();
}
这样做是, * 屏幕布局 * 加载大约 2000 行的 3 列网格 * 将 SQL 表中的车辆编号加载到组合框中。 * 将 SQL 表中的自行车名称加载到组合框中。
我的电脑速度很快,性能最好,但我加载的表单仍然冻结并变成白色几秒钟,然后加载。
我做错了整个线程吗?
【问题讨论】:
-
你启动新线程只是为了通过
BeginInvoke将执行传递给UI线程 -
您对发布的代码所做的事情是在您的 UI 线程中创建一个线程,将工作委托回 UI 线程。您不妨在
EditCustomer_Load方法中完成这项工作。您可能想要做的是在单独的线程中从数据库加载数据,然后调用 UI 线程上的方法来显示数据。 -
@Drik "其实
EditCustomer_Load就是FormLoad方法 -
在 UI 线程上调用
LoadGrid方法。您应该在调用GridCustomerList.BeginInvoke之前完成耗时但不需要访问UI元素的工作。 -
再次。读他说的话。他说在线程中加载数据,然后调用回 UI 以将数据放入控件中。虽然在现代 C' 中(并非完全过时),但您最好使用异步而不是线程。
标签: c# sql multithreading winforms stored-procedures