Я хочу перебрать коллекцию потокобезопасным способом.Я считаю целесообразным иметь один метод с именем
/// <summary>
/// This visits all items and performs an action on them in a thread manner
/// </summary>
/// <param name="visitAction">The action to perform on the item</param>
public void VisitAllItems(Action<Item> visitAction) {
lock (listLock) {
foreach (Item item in this.ItemList) {
visitAction.Invoke(item);
}
}
}
Примером его использования может быть
/// <summary>
/// Saves each item in the list to the database
/// </summary>
protected static void SaveListToDatabase() {
this.VisitAllItems(item => {
bool itemSavedSuccessfully = item.SaveToDB();
if(!itemSavedSuccessfully) {
//log error message
}
});
}
Другим примером его использования будет
/// <summary>
/// Get the number of special items in the list.
/// </summary>
protected int GetNumberOfUnsynchronisedItems() {
int numberOfSpecialItems = 0;
this.VisitAllItems((item) => {
numberOfSpecialItems += item.IsItemSpecial() ? 1 : 0;
});
return numberOfSpecialItems;
}
Но я уверен, что есть лучший способ написания метода VisitAllItems
для использования Func<>
вместо делегата Action<>
для возврата этого значения.Я пробовал несколько вещей, но в конечном итоге с ошибками компиляции.
Кто-нибудь может увидеть более аккуратный способ реализации этого метода?
Спасибо, Alasdair