Efter att ha fått frågan både i forum och på mail och nu senast direkt från en kollega tror jag det är dags att bena ut hur ParallelActivity fungerar och varför den inte alltid gör vad vi förväntar oss.
Först och främst skall vi vara medveten om att workflow foundation är designat kring en ide att vara enkeltrådat. Detta är för att förenkla för oss utvecklare vilket i grunden är en grymt bra idé. Detta begränsar oss oftast inte eftersom flera workflows kan exekvera samtidigt på flera trådar. Vi kan även med korrekt design komma förbi de eventuella begränsningar som finns.
Exempel 1
Här är ett enkelt flöde med två CodeActivitys i en ParallelActivity. I dessa båda code så exekveras koden enligt bild nummer två
Hur lång tid tar detta att genomföra är nu frågan. Ett rimligt antagande är naturligtvis 4 sekunder eftersom det är tiden som den längsta vilan är. Tyvärr är svaret 7 sekunder eftersom schemaläggaren som är grunden i workflow foundation först exekverar codeActivity1 och sedan codeActivity2. Detta beror helt och hållet på vår design och det faktum att vi stoppar den tråd som exekverar oss. Detta är även en av de saker som kan begränsa vår möjlighet att skala upp applikationen.
Exempel 2
I detta exempel skall vi använda DelayActivity istället för Thread.Sleep
delayActivity1 vilar i 4 sekunder och delayActivity2 vilar i 3 sekunder, hur lång tid är nu detta totalt? Svaret i det här fallet är 4 sekunder eftersom det är den längsta vilan som utförs.
Vad är nu den stora skillnaden på exempel ett och två? Svaret är att exempel ett är synkront och exempel två är asynkront. För att få detta att fungera med egna aktiviteter kan de vara händelsedrivna eller returnera ActivityExecutionStatus.Executing och släppa tråden vidare. En bra grundregel är att om du blockerar tråden så gör du fel.
Är något oklart så ställ gärna frågor så kan jag komplettera artikeln.
Inga kommentarer:
Skicka en kommentar