我在C#和WPF创建订单管理器应用程序。 订单管理应用程序需要来回沟通与写在一个完全不同的语言航运航运应用。 程序之间的通信的方法是一个XML文件,其EnableShipping属性可以是一个0或1和SQL数据库。
在我的订单管理器应用程序,我有按钮“开始发货”,并改变从0 EnableShipping属性为1.运输应用循环并读取该值,开始出货其所有特定属性的字符串相匹配的命令,这改变归因于不同的弦,并标志着一个不同的属性(状态改变)为1。
在我的订单管理器应用程序,截至目前我有一个线程,不断循环和检查为1的状态改变属性的订单数据库,使更改UI并写入到数据库中,状态改变= 0。
下面是一些代码来展示一下我的订单管理器应用程序在线程执行。
while(true)
{
string enabled = null;
currentInstance = OrderManager.getCurrentInstance();
SqlCommand command = new SqlCommand("Select OrderNumber, BatchStatus from dbo.Orders where StatusChanged='1'", connection1);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Int64 orderNum = (Int64)reader[0];
int index = linqForOrderIndex(orderNum);
string batchStatus = (string)reader["BatchStatus"];
SqlCommand statusChangedFalse = new SqlCommand("Update dbo.orders Set StatusChanged = '0' where OrderNumber = '" + orderNum + "'", connection2);
switch (batchStatus)
{
case "Untouched":
currentInstance.Orders[index].batchStatus = "Untouched";
break;
case "Batch Ready":
currentInstance.Orders[index].batchStatus = "Batch Ready";
break;
case "Shipped":
currentInstance.Orders[index].batchStatus = "Shipped";
break;
case "Error":
currentInstance.Orders[index].batchStatus = "Error";
break;
}
statusChangedFalse.ExecuteNonQuery();
Thread.Sleep(1000);
reader.Close();
reader = command.ExecuteReader();
}
currentInstance.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
currentInstance.refreshTreeFilters();
currentInstance.refreshOrderCounts();
currentInstance.batchReadyView();
}
));
}
}
所以,即使你不知道到底是什么代码怎么回事,你知道,我必须不断检查数据库的状态更改的项目,做我的收藏中的那些项目,以及在数据库中工作,更新UI和不断重复该过程。
起初我还以为很老的线程将工作像我的代码现在正在做的,但是当我在“做工作”的UI变得反应迟钝。 我看了一些后台工作的代码在网上看到的,如果可能,这将是更好的UI响应一个不错的选择,但不知道这是否是一个很好的解决方案,因为我需要不断地继续做工作,并更新UI。
任何想法或建议? 欣赏它......