1

这是一个代码示例。想象一下,它不是一个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起来更简单。

4

2 回答 2

2

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

于 2012-07-17T15:34:26.157 回答
1

这就是它的工作原理。只有您传递给 BeginInvoke 的委托将在 UI 线程上执行 - 之后的任何代码BeginInvoke都将在后台线程上发生。

于 2012-07-17T14:32:10.507 回答