QueueUserWorkItem在BeginInvoke之后切换回后台线程?

时间:2012-07-17 14:07:40

标签: c# wpf threadpool dispatcher

这是一个代码示例。想象一下,它不是ViewModel,与它无关。

解释

所以我有一个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看起来更简单。

2 个答案:

答案 0 :(得分:2)

BeginInvoke方法将要在UI线程上完成的工作“排队”(它可能已经忙于做其他事情)。在BeginInvoke之后,后台线程继续运行委托的其余部分。当它完成运行您的委托时,后台线程(线程池线程)将返回到池中以便可能重用。所以,是的,BeginInvoke之后的代码在后台线程上运行。

答案 1 :(得分:1)

这就是它的工作原理。只有传递给BeginInvoke的委托才会在UI线程上执行 - 在BeginInvoke后面的任何代码将出现在后台线程上。