Шаблон C# MVVM

Хороший шаблон ViewModel для MVVM паттерна в WPF

public class BaseViewModel : INotifyPropertyChanged
{
public virtual void OnNavigatedTo(NavigationEventArgs args) { }  
public virtual void OnNavigatedFrom(NavigationEventArgs args) { }
public virtual void OnViewUnloaded(object sender, RoutedEventArgs e) { }
public virtual void OnViewLoaded(object sender, RoutedEventArgs e) { }
#region Propertychanged
protected void OnPropertyChanged(Expression> action)
{
var propertyName = GetPropertyName(action);
OnPropertyChanged(propertyName);
}
private static string GetPropertyName(Expression> action)
{
var expression = (MemberExpression)action.Body;
var propertyName = expression.Member.Name;
return propertyName;
}
private void OnPropertyChanged(string propertyName)
{
try
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
catch { }
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}

 

или

public class BaseViewModel : INotifyPropertyChanged
{
#region Propertychanged
protected void OnPropertyChanged<T>(Expression<Func<T>> action)
{
var propertyName = GetPropertyName(action);
this.OnPropertyChanged(propertyName);
}
private static string GetPropertyName<T>(Expression<Func<T>> action)
{
var expression = (MemberExpression)action.Body;
var propertyName = expression.Member.Name;
return propertyName;
}
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}

Использовать потом в виде OnPropertyChanged(()=> PorpertyName)

Паралельные операции в C# и как это использовать

 Паралельность может быть в двух видах.

1. Паралельные циклы

2. Паралельный LINQ

Как этим пользоваться?

Для паралельных операций надо использовать конструкции вида:

 

Parallel.ForEach(collection,
currentElement =>
{
// что-то делаем
});

 

Parallel.For(0, 50, i =>
{
// что-то делаем
});

 

для остановки Parallel.For:

Parallel.For(0, source.Length, (i, loopState) =>
{
// Take the first 100 values that are retrieved
// from anywhere in the source.
if (i < 100)
{
// Accessing shared object on each iteration
// is not efficient. See remarks.
double d = Compute(source[i]);
results.Push(d);
}
else
{
loopState.Stop();
return;
}

} // Close lambda expression.
); // Close Parallel.For

Очень важно использовать коллекции типа ConcurrentBag(T)
Из неймспейса  System.Collections.Concurrent
Иначе будут ошибки.

Что касается LINQ  то к запросу нужно добавить .AsParallel()

var test = from i in test.TestTables.AsParallel()
where i.PayDate >= date.Date 
select new { PaySum = i.PaySum};

 

Для сохранения порядка при выполнении запроса можно дописать .AsOrdered(), но это замедлит выполенение запроса.


Опять же надо быть осторожным, т.к. возможны ошибки связанными с доступом к переменным условия.

.