1

C#とWPFで作成された注文マネージャーアプリケーションがあります。Order Managerアプリケーションは、完全に異なる配送言語で記述された配送アプリケーションとやり取りする必要があります。プログラム間の通信方法は、EnableShipping属性が0または1のいずれかであるXMLファイルとSQLデータベースです。

Order Managerアプリケーションには、「出荷を開始」ボタンがあり、EnableShipping属性を0から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を更新する必要があるため、これが良い解決策であるかどうかはわかりませんでした。

何か考えや提案はありますか?感謝します...

4

1 に答える 1

0

BackGroundWorkerとReportsProgessを使用して、情報をUIスレッドに送信できます。オブジェクトを渡すことができます。また、ストリームをシャットダウンしないようにキャンセルを実装します。

BackgroundWorker.ReportProgressメソッド

もう1つのオプションは、SQL通知を取得する方法があります。

SQLServerでのクエリ通知

于 2012-09-20T20:51:46.833 に答える