c# - 从后台线程调用时绑定(bind)失败

标签 c# wpf multithreading

您好,我在从后台线程更新绑定(bind)时遇到了一些问题。我正在显示一个 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 线程获取并存储当前调度程序,然后稍后使用该调度程序,但您真正应该做的只是让后台工作人员为您处理编码到 UI 线程,正如您展示的那样在您的工作示例中,而不是尝试手动编码到 UI 线程。

关于c# - 从后台线程调用时绑定(bind)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462627/

相关文章:

c# - 使用泛型访问基抽象类方法中的子类对象

c# - Entity Framework -如何提高任何属性的OnChanging?

c - 在 C 编程中如何创建一个线程来创建另一个线程?

multithreading - WGET-同时连接速度很慢

java - 等到子线程完成 : Java

c# - 由于不区分大小写的 URL 和默认值,如何避免 ASP.NET MVC 中的重复内容?

wpf - Winforms和WPF的性能比较

c# - 带有 Razor 的 ASP.NET MVC 3 可重用表显示模板

c# - 为电子邮件附件使用多个内存流

c# - 将 DataRow 中的字符串转换为 double