January 2009 - Posts

zmajcek |> parallel |> Pattern for calling event handlers on UI thread when event fires on worker thread
Wednesday, January 07, 2009 8:24 PM

Recently I was working on a project that required parallel processing. Instead of using Task Parallel Library (TPL), I opt to make my own library (code). This library has very naive approach to task scheduling (without queue stealing technique) but it works smile_teeth.

I wanted it to have appealing API and to be compatible with Windows Apps thread model (which requires code that uses UI components to be executed on UI thread). Here is the code sample that illustrates this:

private void btnStart_Click(object sender, EventArgs e)
{
    ClearMessages();
    WriteMessage("ThreadId = {0}", getManagedThreadId());
    for (int j = 0; j < 20; j++)
    {
        //Create Task that multiplies input parameter by 2
//with pause caused by SpinWait var task = taskManager.Create<int, int>( i => { System.Threading.Thread.SpinWait(50000000); return i * 2; } , j); //When task is completed call WriteMessage method that
// adds line with text to the TextBox
task.Completed += delegate { WriteMessage("ThreadId = {0}; Result = {1}",
getManagedThreadId()
, task.Result); }; } } //This method HAS TO execute on UI thread in order to work private void WriteMessage(string format, params object[] arg) { var lines = txtDisplay.Lines.ToList(); lines.Add(string.Format(format, arg)); txtDisplay.Lines = lines.ToArray(); }

 

When new task is created, task scheduler puts it in to queue to wait for execution. Task executes on worker thread and fires Completed event on completion. And that's the tricky part. Completed event has to fire on UI thread so that you can use windows controls in the event handler to inform user about execution result.

Here is how I did that.

private AsyncOperation asyncOperation;

private SendOrPostCallback completedReporter;
public event EventHandler Completed;
private void CompletedReported(object o)
{
    Done = true;
    if (Completed != null)
    {
        Completed(this, new EventArgs());
    }
}

private SendOrPostCallback progressReporter;
public event ProgressChangedEventHandler ProgressChanged;
public void ProgressChangedReported(object o)
{
    if (ProgressChanged != null)
    {
        ProgressChanged(this, (ProgressChangedEventArgs)o);
    }
} 

I declared asyncOperation variable once and for each event that I wanted to fire on UI thread I declared variable of type SendOrPostCallback (beside standard event and event firing routine).

internal Task(Func<T, TResult> func, T data)
{
    Func = func;
    Data = data;
    Done = false;
    asyncOperation = AsyncOperationManager.CreateOperation(null);
    completedReporter = new SendOrPostCallback(CompletedReported);
    progressReporter = new SendOrPostCallback(ProgressChangedReported);
}

 

Then I instantiated asyncOperation variable and SendOrPostCallback variables associating them with appropriate event firing routines.

Now I could easily fire events on UI thread. Here is the code for Execute method that executes given task and fires Completed event:

internal override void Execute()
{
    _result = Func(Data);
    if (asyncOperation != null)
    {
        asyncOperation.Post(completedReporter, null);
    }
    else
    {
        completedReporter(null);
    }
}

 

Please note, that in this case, code execution on worker thread continues when the event is fired on the UI thread, WITHOUT WAITING for associated event handlers to complete execution on UI thread.

Till next reading,

ZBL

IT Service Management Forum u Srbiji
Monday, January 05, 2009 12:48 AM

Pre nešto više od mesec dana u beogradskom hotelu Hyatt održana je osnivačka skupština Udruženja itSMF organizacije u Srbiji, kojoj je prisustvovalo i Naše Visočanstvo smile_embaressed. Moguće da se sada pitate zašto tek sada pišem o tome ? Iako mi je cela priča od početka bila interesantna bilo mi je potrebno neko vreme da pohvatam sve konce i skapiramo o čemu se  zapravo tu radi pošto itSMF sajt nažalost nije od velike pomoći u dobijanju početnih informacija vezanih za IT Service Management smile_confused. Ali ne brinite, kada budete pročitali ovaj post biće vam sve jasno smile_tongue.

Kao što u Wikipediji lepo piše IT Service Management (ITSM) podrazumeva upravljanje IT sistemom  u skladu sa poslovnim potrebama korisnika, tj. potpuno je usresređen na poslovnu vrednost koju generiše za korisnika. Zbog toga je velika pažnja usmerena i na ne IT procese (npr. Financial Management). Ovo važi nevezano za to da li je korisnik unutar firme ili druga firma.

Sam način upravljanja opisan je generičkom (framework) metodologijom ITIL (Information Technology Infrastructure Library). Naziv metodologije rezultat je činjenice da je ona u svom prvom izdanju bila opisana u 31 knjizi smile_confused. U današnjem (v3) izdanju svedena je na 5 ključnih knjiga i više dodatnih publikacija što je znatno doprinelo njenom širenju. Kratak opis metodologije dostupan je u pdf formatu na pedesetak stranica, a još kraći pregled možete pročitati u daljem tekstu Open-mouthed.

Prema ITIL metodologiji IT sve poslove koje obavlja za korisnika grupiše u posebne celine (servise) i navodi ih u dokumentu koji se naziva katalog servisa. Koji će funkcionalnosti (servisi) biti dostupni korisnicima zavisi od strategije za koju se IT opredeli (Service Strategy). Svaki od ponuđenih servisa prolazi kroz razvojni ciklus od projektovanja do operativnog rada.

Kada se IT opredeli da ponudi neki skup usluga kao servis on ulazi u fazu projektovanja servisa (Service Design). U ovoj fazi servis se definiše kao skup funkcionalnosti, performansi, dostupnosti, odgovornosti i garancija što se uobličava u  Service Level Agreement (SLA) dokument. Po završenom projektovanju servisa prelazi se u njegovu implementaciju (Service Transition). U ovoj fazi dolazi do validacije servisa u realnom okruženju, vrše se odgovarajuće izmene (Change Management) što sve dovodi do povećanja baze znanja IT-a (Knowledge Management). Na kraju ciklusa servis ulazi u operativnu upotrebu (Service Operation) što donosi nove izazove za IT (Incident Management, Problem Management). Za IT je važno da tokom svih faza formira i analizira metrike, kao i da na osnovu izvedenih zaključaka postavlja nove ciljeve (Continual Process Improvement). Sve to na kraju dovodi do redizajna servisa i ceo ciklus počinje ponovo.

itil-v3

Ponovo bih istakao da ITIL predstavlja samo generičku metodologiju koju IT može da prilagodi svojim potrebama. Iz ITIL-a se mogu izvesti i specijalizovane ITSM metodologije od kojih je za Microsoft orijentisane ljude svakako najznačajnija Microsoft Operations Framework (MOF). ITIL predstavlja osnovu za međunarodni standard ISO/IEC 20000.

 

mof

Na kraju ostaje da odgovorim na pitanje šta je itSMF Srbija. To je nevladina organizacija koja okuplja IT kompanije i ljude u Srbiji koji su zainteresovani za primenu ili već primenjuju ITIL metodologiju. Ona treba da omogući razmenu znanja i iskustava kroz organizovanje skupova i online forum kao i da olakša pribavljanje odgovarajuće stručne literature vezane za datu tematiku.

do čitanja,

ZBL

by zmajcek | with no comments
Filed under: ,