我有一个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>
答案 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;
}
}