C# 对于我的场景,我应该在WPF和c中使用什么类型的线程。。。常规线程、后台工作线程还是线程池?

C# 对于我的场景,我应该在WPF和c中使用什么类型的线程。。。常规线程、后台工作线程还是线程池?,c#,wpf,multithreading,backgroundworker,threadpool,C#,Wpf,Multithreading,Backgroundworker,Threadpool,我在C#和WPF中创建了一个订单管理器应用程序。order manager应用程序需要与以完全不同的装运语言编写的装运应用程序进行来回通信。程序之间的通信方法是一个XML文件,其EnableShipping属性为0或1以及SQL数据库 在我的order manager应用程序中,我有一个“开始发货”按钮,并将EnableShipping属性从0更改为1。配送应用程序正在循环并读取此值,开始配送其特定属性与字符串匹配的所有订单,将此属性更改为其他字符串,并将其他属性(状态更改)标记为1 在我的or

我在C#和WPF中创建了一个订单管理器应用程序。order manager应用程序需要与以完全不同的装运语言编写的装运应用程序进行来回通信。程序之间的通信方法是一个XML文件,其EnableShipping属性为0或1以及SQL数据库

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

在我的order manager应用程序中,到目前为止,我有一个线程,该线程不断循环并检查数据库中状态更改属性为1的订单,对UI进行更改并写回数据库,状态更改=0

下面是一些代码,显示我的order manager应用程序在线程中执行的操作

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


有什么想法或建议吗?非常感谢……

您可以使用BackGroundWorker和ReportsRoges将信息发送到UI线程。您可以传递一个对象。还可以实现取消,这样就不会关闭流

另一个选项是有一种获取SQL通知的方法


除非有理由,否则请使用后台人员。由于“征求意见”的性质,以“非真实问题”结尾。在任何情况下,发布的代码也很可能不是线程安全的,因为它看起来像是同时从后台线程和UI线程访问相同的数据。我可以使用BackgroundWorkers永远循环并检查数据库中的状态更改项吗?不。那太傻了(BGW是为BG Work->UI result设计的)。所以,排除这种可能性,然后继续。它仍然不会改变我的其他注释。因此,如果我有一个永远运行的线程,检查数据库中的更改并找到一些,然后在代码后面的UI中调用backgroundworker函数“DoWork”…这是正确的方法吗?