Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从后台线程调用时绑定失败_C#_Wpf_Multithreading - Fatal编程技术网

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

C# 从后台线程调用时绑定失败,c#,wpf,multithreading,C#,Wpf,Multithreading,您好,我在从后台线程更新绑定时遇到一些问题。当一些后台处理进行时,我显示一个IsBusy指示器,然后在完成时隐藏该指示器 请注意,如果我在后台工作程序内部将IsLoading设置为false(但通过在UI线程上调用它),它将永远不会更新UI 如果我在UI线程上立即调用它。它起作用了 我错过了什么 private void BeginValidation() { m_ValidationWorker = new BackgroundWorker();

您好,我在从后台线程更新绑定时遇到一些问题。当一些后台处理进行时,我显示一个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线程。

BGW的整个要点是在
DoWork
处理程序中执行非UI工作,并使用其他处理程序更新UI。如果忽略所有其他事件并手动封送到UI线程,则无法实现使用BGW的全部目的。应在
ProgressChanged
事件处理程序中更新UI。在
DoWork
处理程序中,需要调用
\u sender.ReportProgress
方法来触发
ProgressChanged
事件。我相信您不需要在
ProgressChanged
事件处理程序中进行任何封送处理,因为它已经被封送了。我不太确定我是否理解。如何让BGW处理到UI线程的编组?@Asheh当您展示实际有效的示例时,您在问题中准确地展示了如何做到这一点。具体地说,您在
RunWorkerCompleted
中更新UI,而不是
DoWork
。@Servy是否
应用程序.Current.Dispatcher
没有获取UI调度程序?我很感激Dispatcher。CurrentDispatcher将得到错误的一个。我刚刚意识到,我可以使用progressreporter@Servy-我认为Asheh的困难在于您建议在
RunWorkerCompleted
事件中更新UI。此事件仅在结束时触发。我认为应该在
progeschanged
事件中更新UI。