如何更新我的UI而不出现卡顿/死锁

时间:2019-05-17 04:06:29

标签: c# .net wpf asynchronous mvvm

我有一个WPF应用程序,它有一个绑定到名为“ Customers” { sheet:{ id:1, details:[{id:1},{id:2},{id:3},{id:4}] } } 的{​​{1}},还有一个绑定到命令的按钮这开始了一些艰巨的任务。它模拟了尽可能快地向DataGrid添加一堆条目。

我面临的问题是,在向ObservableCollection<string>添加条目时,试图移动UI时似乎出现了结结,并且有时出现了死锁。

据我了解,这是因为我正在使用DataGrid更新UI线程上的DataGrid 甚至它们可能是对UI的小更新,其中很多可能会导致卡顿,这是我的理解,我可能完全错了。

我的问题是..是否有其他方法可以使这种异步或减少卡顿/死锁?

XAML用户界面

DataGrid

MainViewModel

DataGrid

RelayCommand和ObservableObject只是通用的。

RelayCommand

Application.Current.Dispatcher.Invoke(() => { /*Update OC*/ });

ObservableObject

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>

<Grid>
    <StackPanel>
        <DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False" 
                  Width="300" Height="200">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Image" Width="SizeToCells" IsReadOnly="True">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding }" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Width="100"
                Height="25"
                Content="Start"
                Command="{Binding StartAddingCommand}"/>
    </StackPanel>

    <Border VerticalAlignment="Bottom"
            Height="25" Background="Orange">
        <TextBlock Text="{Binding Customers.Count}"
                   HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Border>
</Grid>

1 个答案:

答案 0 :(得分:0)

使用const resources = [{ "date": "2019-04-17", "values": [{ "Customer": "C_name" }, { "Environment": 66.5 }, { "Other": { "goods": "feature", "present": 12 } } ] }] function valid(arr) { return arr .map(x => x.values) .every(y => y.some(z => z.hasOwnProperty("Customer")) && y.some(z => z.hasOwnProperty("Environment")) && y.some(z => z.hasOwnProperty("Other")) ) } console.log(valid(resources));进行foreach时不会出现任何延迟,当然会阻塞UI。

您肯定应该拥有Dispatcher.Invoke方法的async版本,并按如下所示编写GetHTML。例如,使用AddCustomers类的Get...Async方法之一。

HttpClient

然后等待命令操作中的方法:

private async Task AddCustomers()
{
    try
    {
        foreach (var result in await GetHTMLAsync("https://pastebin.com/raw/gG540TEj"))
        {
            Customers.Add(result.ToString());
        }
     }
     catch (Exception e)
     {
         Debug.WriteLine(e);
         throw;
     }
}