Тестовое задание на вакансию Программист C#
Задача #1
Есть "сервер" в виде статического класса.
У него есть переменная count (тип int) и два метода, которые позволяют эту переменную читать и писать: GetCount() и AddToCount(int value).
К серверу стучатся множество параллельных клиентов, которые в основном читают, но некоторые добавляют значение к count.
Нужно реализовать GetCount / AddToCount так, чтобы:
- читатели могли читать параллельно, без выстраивания в очередь по локу;
- писатели писали только последовательно и никогда одновременно;
- пока писатели добавляют и пишут, читатели должны ждать окончания записи.
Задача #2
В .net есть возможность звать делегаты как синхронно:
EventHandler h = new EventHandler(this.myEventHandler);
h.Invoke(null, EventArgs.Empty);
так и асинхронно:
var res = h.BeginInvoke(null, EventArgs.Empty, null, null);
Нужно реализовать возможность полусинхронного вызова делегата (написать реализацию класса AsyncCaller), который бы работал таким образом:
EventHandler h = new EventHandler(this.myEventHandler);
ac = new AsyncCaller(h);
bool completedOK = ac.Invoke(5000, null, EventArgs.Empty);
"Полусинхронного" в данном случае означает, что делегат будет вызван, и вызывающий поток будет ждать, пока вызов не выполнится. Но если выполнение делегата займет больше 5000 миллисекунд, то ac.Invoke выйдет и вернет в completedOK значение false.