这是一个代码示例。想象一下,它不是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
看起来更简单。
答案 0 :(得分:2)
BeginInvoke方法将要在UI线程上完成的工作“排队”(它可能已经忙于做其他事情)。在BeginInvoke之后,后台线程继续运行委托的其余部分。当它完成运行您的委托时,后台线程(线程池线程)将返回到池中以便可能重用。所以,是的,BeginInvoke之后的代码在后台线程上运行。
答案 1 :(得分:1)
这就是它的工作原理。只有传递给BeginInvoke的委托才会在UI线程上执行 - 在BeginInvoke
后面的任何代码将出现在后台线程上。