0

URLをロードして解析し、それらをsqlite dbに保持するアプリを開発しています。UIは保存されたデータを読み取り、コントロールに表示します。この進行は、ほぼ無限ループで行われる必要があります。高速応答を実現するために、メイン スレッドで db からデータを読み取り、データをロードして db に挿入する別のスレッド (バックグラウンド ワーカー) を用意する予定です。ディスパッチャータイマーで読み取りおよび書き込みプロセスを実行し、1 つのタイマーをメイン スレッドで、もう 1 つのタイマーをバックグラウンド ワーカー内で実行することは論理的で可能ですか? そしてどうやって?または、誰かがより良いアイデアを持っていますか?

main thread:
    DispatcherTimer _Timer1 = new DispatcherTimer();
                _Timer1.Interval = _Interval;
                _Timer1.Tick += _Timer1_Tick;
    void _Timer1_Tick(object sender, EventArgs e)
            {
               // read data from db and show in controls
             }

secondary thread:
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        DispatcherTimer _Timer2 = new DispatcherTimer();
                _Timer2.Interval = _Interval;
                _Timer2.Tick += _Timer2_Tick;


    }
    void _Timer2_Tick(object sender, EventArgs e)
            {
               // write data into db
             }
    }
4

2 に答える 2

1

いくつかの URL を読み込み、それらを解析し、それらを sqlite db に保持すると、UI は保存されたデータを読み取り、コントロールに表示します

お願い、それはやめて。独自のスレッド管理システムを作成しないでください。うまくいかないと言っているわけではありませんが、最も恐ろしく、説明のつかない方法で裏目に出る可能性が高いです。たとえば、DisptacherTImer を使用すると、UI スレッドで実行されるため、顔の中で完全に爆発します。ThreadPool.QueueUserWorkItem()またはTask.Run()を考慮してスレッド化を本当に使用したい場合は、ファイア アンド フォーゲット アクションを開始します。

あなたのワークフローも奇妙です。すでに持っているデータをDBに書き込み、それを読み戻してから使用する必要がある理由がわかりません。逆シリアル化されたデータを使用して DB に順次書き込み、UI に表示する方が理にかなっているでしょうか? すでにデータがあることを考慮して、ディスク I/O を含む不必要なループを実行する代わりに?

アプリでメッセージングを使用することを検討しましたか? これは、MVVM Light でMessengerクラスとして実装され、PRISM でEventAggregatorとして実装されている、よく知られた MVVM パターンです。あなたのシステムには「サービスから利用可能な新しいデータ」のメッセージがあり、そのメッセージにはDBへの書き込みとUIの更新の2つのサブスクライバーがあるようです。

于 2013-02-12T01:15:50.743 に答える
1

やろうとしていることがうまくいきません。

_Timer1_Tickとの両方_Timer2_Tickが UI スレッドで実行されます。そこで長時間実行される操作を実行すると、UI がハングします。

わかりません。なぜタイマーが必要なのですか? 時間間隔を測定する以外の目的でタイマーを使用することは、めったに良い戦略ではありません。たとえば、更新プロセスをバックグラウンドの無限ループで実行し、呼び出す DB に新しいデータを配置するとすぐにDispatcher.BeginInvoke(必要なデータを渡す)、UI スレッドに新しく利用可能なデータで更新する必要があることを通知できます。

ちなみに、「HTTP リクエストの送信、レスポンスの待機、解析、保存、繰り返し」などのタスクでは、新しい async/await 機能が当然の選択です。WP7 の場合、この機能は Visual Studio 2010 の「Async CTP」再頒布可能パッケージとして利用できます。WP8 の場合は、既にフレームワークに統合されています。ただし、2 つの間には互換性の問題がいくつかあります。

于 2013-02-11T18:12:29.110 に答える