1

これはコードサンプルです。ViewModelそれがaではなく、それに関連するものが何もないと想像してください。

説明:

だから私はObservableCollectionデータベースから削除したいアイテムを持っています。ブロックUIを回避するために、バックグラウンドスレッドで呼び出します。

データベースに問題があるか、成功した場合は、UIに表示したいと思います。だから私はで小さなコードを呼び出しますDispacther.BeginInvoke

BeginInvoke呼び出すとスレッドコンテキストがUIに変わる ことを知っています。

コードサンプル:

ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
{
    Action completedAction = null;
    try
    {
        //Delete from database;
        item.Delete();
        completedAction = () => { this.Observable.Remove(item); };
    }
    catch (Exception)
    {
        completedAction = () =>
        {
            someTextBox.Text = "Error";
        };
    }

    App.Current.Dispatcher.BeginInvoke(completedAction);
}));

質問:

BeginInvokeスレッドコンテキストをバックグラウンドスレッドに戻した後、それ以上コードを記述しなかったと思っても知りたいです。

PS。私は使用できることを知っていますBackgroundWorkerが、私にはそれを行うために使用する方が簡単に見えますQueueUserWorkItem

4

2 に答える 2

2

BeginInvokeメソッドは、UIスレッドで実行される作業を「キューに入れます」(他の処理を実行するのにすでにビジー状態になっている可能性があります)。BeginInvokeの後、バックグラウンドスレッドは残りのデリゲートを実行し続けます。デリゲートの実行が完了すると、そのバックグラウンドスレッド(スレッドプールスレッド)がプールに戻され、再利用される可能性があります。したがって、はい、BeginInvokeの後のコードはバックグラウンドスレッドで実行されます。

于 2012-07-17T15:34:26.157 に答える
1

それがどのように機能するかです。BeginInvokeに渡すデリゲートのみがUIスレッドで実行されます。それ以降のコードBeginInvokeはバックグラウンドスレッドで発生します。

于 2012-07-17T14:32:10.507 に答える