1

我有一个用 C# 和 WPF 创建的订单管理器应用程序。订单管理器应用程序需要与用完全不同的运输语言编写的运输应用程序来回通信。程序之间的通信方法是一个 XML 文件,它的 EnableShipping 属性是 0 或 1 和一个 SQL 数据库。

在我的订单管理器应用程序中,我有一个“开始发货”按钮并将 EnableShipping 属性从 0 更改为 1。发货应用程序正在循环并读取此值,开始发货其特定属性与字符串匹配的所有订单,更改此属性为不同的字符串,并将不同的属性(状态已更改)标记为 1。

在我的订单管理器应用程序中,到目前为止,我有一个线程不断循环并检查数据库中 Status Changed 属性为 1 的订单,对 UI 进行更改并写回数据库,Status Changed = 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。

有什么想法或建议吗?欣赏它...

4

1 回答 1

0

您可以使用带有 ReportsProgess 的 BackGroundWorker 将信息发送到 UI 线程。你可以传递一个对象。还实施取消,这样你就不会关闭流。

BackgroundWorker.ReportProgress 方法

另一种选择是有一种获取 SQL 通知的方法。

SQL Server 中的查询通知

于 2012-09-20T20:51:46.833 回答