0

API を介してプッシュされた株価情報を含むプログラムがあります。このプログラムには、XAML で作成されたフロント エンドもあり、このプログラムの実行中はフリーズします (つまり、API が送信する情報を処理します)。Dispatcher.Invoke および/または BackgroundWorker を使用してみましたが、スレッド化について十分に調べましたが、フリーズを解除できません。おそらく、私は何か間違ったことをしているだけです。関連するコードをここに添付しました。誰かが助けてくれることを望んでいました。

    private void QuoteUpdate(QuoteInfo info)
    {
        BackgroundWorker bwQuoteUpdate = new BackgroundWorker();
        bwQuoteUpdate = new BackgroundWorker();
        bwQuoteUpdate.WorkerSupportsCancellation = true;

        bwQuoteUpdate.DoWork += bwQuoteUpdate_DoWork;            
        bwQuoteUpdate.RunWorkerAsync(info);         
    }

    private void bwQuoteUpdate_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(() =>
            {
                QuoteInfo info = e.Argument as QuoteInfo;
                //logical functions and work are here

            }));
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show("Error in QuoteUpdate: " + ex.Message, "Exception Thrown");
        }

    }        
4

3 に答える 3

1

BackgroundWorker実行時間の長いタスクをバックグラウンド スレッドで実行する目的で を作成していますが、それでもすべての処理を UI スレッドにディスパッチしています。

private void bwQuoteUpdate_DoWork(object sender, DoWorkEventArgs e)
{
    // Code here runs on background thread.

    Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(() =>
    {
        // Code here runs on UI thread.
    }));
}

最初にバックグラウンド スレッドで計算を実行する必要がありますが、UI コンポーネントは更新しないでください。むしろ、すべての結果をローカル変数に保存してください。それが完了したら、 を使用しDispatcher.Invokeて制御を UI スレッドにディスパッチし、ローカル変数に格納された結果を使用して UI を更新します。

例えば:

private void bwQuoteUpdate_DoWork(object sender, DoWorkEventArgs e)
{
    // Code here runs on background thread.
    QuoteInfo info = e.Argument as QuoteInfo;
    string result = PerformLongRunningProcessing(info);

    Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(() =>
    {
        // Code here runs on UI thread.
        this.resultTextBox.Text = result;
    }));
}
于 2012-05-08T18:04:23.257 に答える
1

はい、あなたは何か間違ったことをしています。計算はスレッドのみで行う必要があり、UI の変更のみを で行う必要がありますDispatcher.Invoke

また、 を介して DataBinding を使用する場合は、UI スレッドへの変更のマーシャリングが自動的に行われるため、完全にINotifyPropertyChange削除します。Dispatcher.Invoke

于 2012-05-08T18:04:40.487 に答える
0

試す

Dispatcher.BeginInvoke(...)
于 2012-05-08T20:45:01.503 に答える