我有一个从本机代码调用的事件处理程序。我需要在那里做一些事情,然后为4个不同的UserControl调用异步更新。这个想法是事件处理程序可以继续进行,以便可以完成本机端的其他内容。我的第一次尝试就像:
interface ISelectedObjectDependent
{
void SelectedObjectsChanged();
}
public void ObjectSelectionChanged(object sender, EventArgs e)
{
// this is important stuff that UserControl update methods
// need to access
_selectedObjectIds.Clear();
_updateIds = true;
Count = Interface.UI.SelectedObjects.Count;
ObjectProperties.Instance.AttributeObject = Count == 1
? Interface.UI.SelectedObjects.Get().FirstOrDefault()
: null;
foreach (var vm in MyApp.ViewModels)
{
if (vm.Value is ISelectedObjectDependent)
{
App.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)(() =>
{
((ISelectedObjectDependent) vm.Value).SelectedObjectsChanged();
}));
}
}
}
实现ISelectedObjectDependent的ViewModel具有如下方法实现:
public void SelectedObjectsChanged()
{
// do some stuff
// ....
// refresh datagrid
ContractsItemsSource.Refresh();
}
我的问题是:是否有更好的方法来刷新4个UserControl内容:
答案 0 :(得分:1)
这个我的解决方案只能限制最长的单个无响应时间和总无响应时间。问题是发送了多个异步调用并且没有执行任何操作。
我启动异步方法完全相同,但我通过跟踪调用来限制异步调用的数量。此外,如果没有必要,我根本不打电话,我有电话的订单/优先权。
ISelectedObjectDependent.cs
import pandas as pd
df = pd.read_csv('path/to/yourfile.csv')
df['NEW'] = df.RATE * df.DEATHS
df.to_csv('path/to/yournewfile.csv')
SelectedObjects.cs
interface ISelectedObjectDependent
{
void SelectedObjectsChanged();
int ExecutionOrder { get; }
bool NeedsRefresh();
int QueueCount { get; set; }
}
ContractsViewModel.cs(4个实现之一)
private List<ISelectedObjectDependent> _viewModels;
public void ObjectSelectionChanged(object sender, EventArgs e)
{
_selectedObjectIds.Clear();
_updateIds = true;
Count = Interface.UI.SelectedObjects.Count;
ObjectProperties.Instance.SetAttributeObjectNoRefresh(Count == 1
? Interface.UI.SelectedObjects.Get().FirstOrDefault() : null);
if (_viewModels == null)
{
_viewModels = new List<ISelectedObjectDependent>();
_viewModels = MyApp.ViewModels.Where(vm => vm.Value is ISelectedObjectDependent).Select(vm => (ISelectedObjectDependent)vm.Value)
.OrderBy(vm => vm.ExecutionOrder)
.ToList();
}
foreach (var vm in _viewModels)
{
if (vm.NeedsRefresh() && vm.QueueCount < 1)
{
vm.QueueCount++;
App.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action) (() =>
{
vm.SelectedObjectsChanged();
}));
}
}
}