簡體   English   中英

使用異步/等待,但UI仍然使用Caliburn.Micro BindableCollection AddRange掛起

[英]Using async/await but UI still hangs using Caliburn.Micro BindableCollection AddRange

我遇到了一個問題,即我的UI在一秒左右時間內沒有響應,我猜它的Async / Await技能還沒有升級到最新版本。

它是使用Caliburn Micro Framework的WPF應用程序。 我發現sofer的是,我的UI在搜索程序包(Nuget.Core)時是響應的,並且當任務返回時帶有綁定的元素列表及其在可綁定集合中占主導的AddRange。 (它的Feed中最多包含5個元素,因此我不明白為什么要將這幾個元素放入集合中要花更多的時間才能完成。

    protected override async void OnActivate()
    {
        base.OnActivate();
        this.PropertyChanged += PluginManagerViewModel_PropertyChanged;            

        IsBusy = true;
        var list = await SearchPackages();
        this.Packages.AddRange(list);
        IsBusy = false;

    }
    async void  PluginManagerViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "SelectedVersion":
            case "SelectedSortBy":
               var list= await SearchPackages();
               this.Packages.AddRange(list);
                break;
            default:
                break;
        }

    }
    public BindableCollection<IPackage> Packages { get; set; }
    private Task<IEnumerable<IPackage>> SearchPackages()
    {
        return Task.Run(() =>
                SelectedSortBy.OrderBy(
                (_manager.SourceRepository
                .Search("", SelectedVersion != "Stable")))
                .AsEnumerable()
                .Where(PackageExtensions.IsListed));
    }

這是列表視圖:

<ListView ScrollViewer.PanningMode="VerticalFirst"
                   ScrollViewer.VerticalScrollBarVisibility="Visible"
                   ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                   ScrollViewer.PanningRatio="0.5"
                   x:Name="Packages">
                   <ListView.ItemTemplate>
                    <DataTemplate>
                            <Grid cal:Bind.Model="{Binding}">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="4*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock x:Name="Description" Grid.Column="1" Margin="10,27.96,136,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="62.04"/>
                            <TextBlock x:Name="Title" TextWrapping="Wrap"  VerticalAlignment="Top"  FontWeight="Bold" Grid.Column="1" Margin="10,10,136,0"/>
                            <Button Content="Install" HorizontalAlignment="Right" VerticalAlignment="Top" Width="121" Grid.Column="1" Margin="0,10,10,0"/>
                            <TextBlock Grid.Column="1" x:Name="Version" HorizontalAlignment="Right"  Margin="0,32.96,10,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextAlignment="Right" FontWeight="Bold"/>
                        </Grid>
                    </DataTemplate>
                   </ListView.ItemTemplate>
            </ListView>

這不是一個完美的解決方案,但我的UI至少可以再次響應。

    private async Task UpdatePackagesCollection()
    {

        IsBusy = true;
        var list = await SearchPackages().ConfigureAwait(false);    
        this.Packages.Clear();
        IsBusy = false;
        foreach (var p in list)
        {
            await App.Current.Dispatcher.InvokeAsync(() =>
            {
                Packages.Add(p);

            }, DispatcherPriority.ContextIdle);
        }  
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM