понедельник, 14 ноября 2016 г.

Как добавить поле в dbml

В принципе Stackoverflow советует  удалить полностью табличку из дизайнера и потом добавить вновь - однако если у вас идет куча связей в таблицу - скорее всего большинство слетит.

Потому самый простой способ добавить поле - сделать это руками:

1. Добавляем приватную часть:
    private bool _Cancellation;

2. Потом прототипы функций Changing и Changed:

    partial void OnCancellationChanging(bool value);
    partial void OnCancellationChanged();

3. Публичную часть:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Cancellation", DbType="Bit NOT NULL")]
public bool Cancellation
{
get
{
return this._Cancellation;
}
set
{
if ((this._Cancellation != value))
{
this.OnCancellationChanging(value);
this.SendPropertyChanging();
this._Cancellation = value;
this.SendPropertyChanged("Cancellation");
this.OnCancellationChanged();
}
}
}

пятница, 9 сентября 2016 г.

RegExp для повседневной жизни

  • Номер кредитки:
[0-9]{13,16}
  • ICQ:
([1-9])+(?:-?\d){4,}
  • Набор из букв и цифр (латиница):
^[a-zA-Z0-9]+$
  • Набор из букв и цифр (латиница + кириллица):
^[а-яА-ЯёЁa-zA-Z0-9]+$
  • Домен (например abcd.com):
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
  • IPv4: 
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
  • IPv6:
((^|:)([0-9a-fA-F]{0,4})){1,8}$
  • Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):
^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$
  • Пароль (Строчные и прописные латинские буквы, цифры):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
  • Пароль (Строчные и прописные латинские буквы, цифры, спецсимволы. Минимум 8 символов):
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
  • Дата в формате YYYY-MM-DD:
[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])
UPD. Более строгая проверка:
(19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)
  • Дата в формате DD/MM/YYYY:
(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
  • Целые числа и числа с плавающей точкой (разделитель точка):
\-?\d+(\.\d{0,})?
  • UUID:
^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$
  • Широта или долгота:
-?\d{1,3}\.\d+
  • E-mail :
^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$
  • URL на латинице. Если нужно распознавать и кириллические домены, необходимо изменить все «a-z0-9» на «а-яёa-z0-9» и добавить в список доменных зон «рф»:
~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
  • Время в формате HH:MM:SS:
^([0-1]\d|2[0-3])(:[0-5]\d){2}$
  • Mac-адрес :
([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}

пятница, 10 июня 2016 г.

Немасштабируемый вэб сервер IIS - откуда он берется ?

Плохая архитектура


Представим себе что мы написали ASP.NET или WCF приложение без использования асинхронных операций - что произойдет ?

При попытке коннекта от клиента IIS создаст в ThreadPool новый поток, который создаст запрос к базе данных и ЗАБЛОКИРУЕТСЯ ожидая ответа ! В случае с высокой загрузкой сервера, когда блокировки будут возникать быстрее чем база данных отдавать ответы разблокируя поток - число заблокированных потоков будет расти.


Но что самое главное - у этого роста есть четкий предел: -лишь  определенное количество потоков поток ThreadPool сможет создать,  и наступит момент когда система выдаст OutOfMemory Exception ! И данное исключение не может быть обработано - так как исключение возникает в самом ThreadPool и наш код в этот момент находиться в стеке.

То есть что произойдет - процесс сервера будет уничтожен (TerminateProcess) вместе со всеми потоками, но как только первый же клиент создаст запрос - процесс создастся вновь автоматически, и все опять пойдет по кругу !

Возникает "магия" - вдруг ни с того ни с сего клиенты не получают ответов (периодически), но потом все работает как обычно ...

суббота, 4 июня 2016 г.

Контексты исполнения (ExecutionContext) и синхронизации (SynchronizationContext) - что это такое и с чем их едят ?

Контекст исполнения (ExecutionContext) 


Если коротко - это некие "внешние данные", причем они подобны воздуху - мы его не замечаем пока его используем, но его отсутствие смерти подобно ! Обычно это данные по правам и доступам (Principal), данные аутентификации и т.д. и т.п. Сам же ExecutionContext -  это просто контейнер для данных.
Причина его появления понятна и ясна - если в синхронном мире у нас есть только один поток и данные не изменны , то в асинхронном нам надо знать а где мы вообще в данный момент времени .

пятница, 3 июня 2016 г.

Особенности await в WinForms

Если попытаться запустить await функцию из из основного потока WinForms - то ничего не получиться - все скомпилируется, вызовется до await, после чего управление как и положено вернется в основной поток, но так как это не совсем простой поток - а основной поток GUI  у которого имеется SynchronizationContext - то await поток обратного вызова который рассматривался в предыдущем посте никогда не получит управления и приложение "зависнет":



четверг, 2 июня 2016 г.

Ограничения для Async - где нельзя применять !



Async применять нельзя в/для :

  • функции - точке входа программы ( функция Main не может быть async)
  • конструкторе класса, property get/set методы, и методы для event add/remove
  • функции с параметрами out / ref
  • никаких await в catch, finally и unsafe блоках ( начиная с C# 6 - можно в catch, finally )
  • также нельзя использовать в блокировках lock или Monitor Enter/Exit
    • вместо этого используйте SemaphoreSlim.WaitAsync
  • в запросах (например linq) await можно использовать только
    • в первой коллекции from или join

Асинхронные функции C# - как работает await/async

Префикс await по сути своей создает отдельный поток (№13 в нашем случае), который ставиться в пул CLR и ожидает когда основной поток ( №10) передаст ему управление: