WINFORM 主界面打开后会自动启用定时器timer1,每个1分钟获取一次订单
但是每次显示单据获取中或已获取XX条时界面会卡,我已经开了一个线程还是不行
代码是这样的
private void GetOrdersText()
{
if (!IsReset)
{
tsslblOrdersStatus.Text = "单据获取中...";
Application.DoEvents();
tmrChangeOrderStatus.Enabled = false;
int orderNum = 0;
Queue<string> queue = new Queue<string>();
InsertOrdersJsonData(out orderNum, out queue);
if (orderNum == 0)
{
tsslblOrdersStatus.Text = "已获取0条";
Application.DoEvents();
Thread.Sleep(50);
}
else
{
int number = 0;
foreach (string item in queue)
{
PrintOrders(item, out number);
}
queue.Clear();
for (int i = 1; i <= orderNum; i++)
{
tsslblOrdersStatus.Text = "已获取" + i.ToString() + "条";
Application.DoEvents();
Thread.Sleep(50);
}
}
IsReset = true;
tmrChangeOrderStatus.Enabled = true;
k = int.Parse(bus.GetAttrValueByUserName("数据获取频率", Business.userName));
if (orderNum != 0)
{
foreach (Control p in pnlMain.Controls)
{
if (p is FrmPrinting)
{
FrmPrinting frmPrint = new FrmPrinting();
ChangePanel(frmPrint);
break;
}
}
}
}
else
{
if (tmrChangeOrderStatus.Enabled)
{
tsslblOrdersStatus.Text = (k - 1).ToString() + "秒后获取订单";
k--;
if (k == 1)
{
k = int.Parse(bus.GetAttrValueByUserName("数据获取频率", Business.userName));
IsReset = false;
}
}
}
}
------解决思路----------------------
你的线程在哪里呢?没看到相关代码
------解决思路----------------------
另外要注意,也没有任何理由直接说“多线程处理”就能让程序执行加快。适合多线程处理的程序,是因为考虑到cpu有空闲,线程也没有阻塞现象。如果cpu没有空闲,或者线程中有不恰当的阻塞,那么多线程反而会让程序变慢。
你的程序实在是看不懂。不过看到你似乎有几个“变量”的命名类似与想搞什么“死循环的标志”的意思。如果真是如此,那么你设计的这种程序再妄想“用多线程执行”,那其实很可能就是灾难的。
多线程的程序设计,首先还是要在线程所执行的方法中尽量去掉“循环、阻塞”的语句,这样才能避免因为多线程而带来灾难性后果。