在循环或循环之前调用Device.BeginInvokeOnMainThread?

时间:2018-04-12 02:36:33

标签: c# .net xamarin xamarin.forms xamarin.ios

我想弄清楚什么是最佳性能?我必须一次添加大约30个引脚。此代码位于从Task.Run();

调用的方法中
if (Pins != null)
    foreach (Pin pin in Pins)
        Device.BeginInvokeOnMainThread(() => Map.Pins.Add(pin));

或者

Device.BeginInvokeOnMainThread(() => 
{
    if (Pins != null)
        foreach (Pin pin in Pins)
            Map.Pins.Add(pin));
});

1 个答案:

答案 0 :(得分:2)

正如您所猜测的那样,第二个例子更好。此外,这是移动的土地,所以你可以获得的性能提升,拿走它们。

Device.BeginInvokeOnMainThread(() => 
{
    if (Pins != null)
        foreach (Pin pin in Pins)
            Map.Pins.Add(pin));
});

每次迭代都不会与UI线程混搭。

另外我会考虑另一个步骤,如果Map.Pins ObservableCollectionPinsIEnumerbale和/或List一次性添加它们,每次都保存通话/提高通知。

Map.Pins = Pins;
// or
Map.Pins = new ObservableCollection(Pins);
// raise notification depending on your plumbing

如果您需要添加到现有的ObservableCollection,不幸的是它支持AddRange(),那么请考虑创建一个全新的实例,然后替换它。这又取决于你的方法和原因。

var temp = new ObservableCollection(Map.Pins);

foreach (Pin pin in Pins)
   temp.Add(pin);

Map.Pins = Temp;
来自SushiHangover的

更新

  

Pins是只读属性

因此批量更新不适用(如上所示)