繁体   English   中英

从后台线程调用时绑定失败

[英]Binding Fails when Calling From Background Thread

您好,我在从后台线程更新绑定时遇到了一些麻烦。 在进行一些后台处理时,我正在显示IsBusy指示器,然后在完成时隐藏该指示器。

请注意,如果我在后台工作程序内部将IsLoading设置为false(但是通过在UI线程上调用它),则它永远不会更新UI。

如果我之后立即调用它,则在UI线程上。 有用。

我想念什么?

        private void BeginValidation()
    {
        m_ValidationWorker = new BackgroundWorker();

        m_ValidationWorker.WorkerReportsProgress = false;
        m_ValidationWorker.DoWork += (_sender, _args) =>
        {
            foreach (DataRecord record in DatabaseViewModel.Instance.Records)
            {
                record.Init();

                Application.Current.Dispatcher.Invoke(()=> { record.IsLoading = false; }); //THIS DOESN'T WORK
            }
        };

        m_ValidationWorker.RunWorkerCompleted += (_sender, _args) =>
        {
            foreach (DataRecord record in DatabaseViewModel.Instance.Records)
            {
             record.IsLoading = false;//THIS WORKS
            }
        };

        m_ValidationWorker.RunWorkerAsync();
    }

而xaml仅供参考。

            <telerik:RadBusyIndicator IsBusy="{Binding FirstRecord.IsLoading}" IsIndeterminate="True" DisplayAfter="0" BusyContent="Processing" Style="{StaticResource RadBusyIndicatorStyle}">
            <Grid>
                    <ScrollViewer HorizontalScrollBarVisibility="Disabled" Padding="5">
                        <ItemsControl ItemsSource="{Binding FirstRecord.Fields}" ItemTemplateSelector="{StaticResource FormView_TypeSelector}"/>
                    </ScrollViewer>
            </Grid>
        </telerik:RadBusyIndicator>

您正在从非UI线程获取当前的调度程序,并尝试使用它。

虽然您可以从UI线程获取并存储当前的调度程序,然后在以后使用该调度程序,但是您真正应该做的就是让Background Worker为您处理到UI线程的封送处理,如您所展示的如何工作例如,而不是尝试手动编组到UI线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM