我应该在WPF和C#我的情况...定期线程,后台工作,或线程池使用什么类型/类型线程的?(What

2019-10-17 06:15发布

我在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。

任何想法或建议? 欣赏它......

Answer 1:

你可以使用BackgroundWorker的与ReportsProgess发送信息到UI线程。 你可以传递一个对象。 还实现了消除,所以你你不关闭流。

BackgroundWorker.ReportProgress方法

另一种选择是有一个办法让SQL通知。

查询通知SQL Server中



文章来源: What type/types of threading should I use in WPF and c# for my scenario… regular threads, background worker, or thread pool?