簡體   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