Программирование >>  Программирование с использованием ajax 

1 ... 385 386 387 [ 388 ] 389 390 391 ... 396


public sealed partial class Workflowl: SequentialWorkflowActivity {

public Workflowl0 {

InitializeComponent ();

public int LoopCount { get; set; }

private void incCounter ExecuteCode(object sender, EventArgs e) {

LoopCount++;

Bee декларативные правила сохраняются вместе с рабочим потоком в файле с расширением . rules. Увидеть этот файл можно, развернув рабочий поток в окне Solution Explorer, как показано на рис. 36.9.

Solution 05 V.h,leDeclaratrve а project) Е 3 05 WhiieOecbrative i} Properties [ii References S3 Program cs - orHlowl cs

/ orkflohvl de.igner cs

v.oriflcv.l ijies

Puc. 36.9. Файл . rules в акиеSolution Explorer

Этот файл содержит все касающиеся конкретного потока правила в формате XML. Эти правила вычисляются во время выполнения (т.е. в формат .NET-кода они не преобразуются), так что лучше использовать их как можно реже, потому что работать так же быстро, как кодовые условия, они не будут. Однако стоит отметить, что конечным пользователям, конечно же, легче определять правила декларативно, чем писать и компилировать код.

Действие WhileActivity принимает только одно единственное действие в качестве непосредственного потомка, т.е., например, включать в него напрямую одновременно и действие CodeActivity, и действие DelayActivity нельзя. На первый взгляд это может показаться очень ограничивающим фактором для использования While, но перетаскивание действия SequenceActivity позволяет добавлять в него и другие действия.

Действие SequenceActivity

Действие SequenceActivity представляет собой еще одно составное действие, которое позволяет добавлять внутри него любое количество дочерних действий. По самому его названию понятно, что оно последовательно выполняет эти дочерние действия. В примере с WhileActivity оно применялось для размещения все действий, которые должны были выполняться внутри тела цикла.

Как и у других составных действий, у SequenceActivity также имеется два других представления. Доступ к ним можно получать щелчком на доступном рядом с любым составным действием раскрывающемся списке. На рис. 36.10 показано, где он находится в случае действия SequenceActivity.


Рис. 36.10. Раскрывающийся список действия SequenceActivity



В раскрывающемся списке действия SequenceActivity доступно три варианта: View Sequence (Вид последовательности), View Cancel Handler (Вид обработчика операций отмены) и View Fault Handlers (Вид обработчиков неисправностей). На рис. 36.11 показаны представления обработчика операций отмены и неисправности.

SequenceActivityl cancellationHandlerActivity

Сюда можно перетаскивать действия

SequenceActivity2 faultHandlersActivityl

ОСюда можно перетаскивать Л действия типа FaultHandlerActivity

Сюда можно перетаскивать действия типа FaultHandlerActivity

Рис. 36.11. Обработчики операций отмены и неисправности

При написании .NET-кода его обычно заключают внутрь блоков try/catch. В блоке try, как правмо, выполняется такой код, который может выдавать исключение, а в блоке catch (каковых может быть и несколько) определяется то, что должно происходить в случае выдачи исключения. Следствием этого в WF является применение в определенном составном действии обработчиков неисправностей. Блок try в таком экземпляре состоит из того действия или действий, которые находятся внутри основного тела составного действия - в случае SequentialActivity таковыми являются те действия, которые находятся внутри представления по умолчанию, а в случае WhileActivity - те, которые находятся внутри блока while.

Обработка неисправностей

sequenceActivity2 faultHandlersActivityl

ergunr>entException I

. h ncjieInvalidArg

ument

Рис. 36.12. Пример добавления обработчиков исключений System.ArgumentException и System,Exception

Определять блок catch (или набор блоков catch) можно путем отображения представления обработчиков неисправностей и последующего перетаскивания любого количества экземпляров FaultHandler Activity в область с пометкой Drop FaultHandlerActivity Here (Сюда можно перетаскивать действия типа Fault HandlerActivity), которая показывалась на рис. 36.11. В примере на рис. 36.12 обработчики определяются для двух исключений, которые могут выдаваться в SequenceActivity, а именно- для исключения System.ArgumentException и для исключения System.Exception. При перетаскивании действия FaultHandlerActivity на поверхность конструктора необходимо обязательно задавать для него свойство Fault Туре - оно позволяет указывать тип перехватываемого исключения. После этого внутри тела действия уже можно определять то действие или действия, которые должны выполняться в случае генерации исключения такого типа.



В сущности все это приводит к созданию блока try/catch, как показано в следующем фрагменте кода:

Выполнение действий внутри тела SequentialActivity

catch ( System.ArgumentException argex )

Действия, подлежащие выполнению в случае генерации исключения ArgumentException

catch ( System.Exception ex )

Действия, подлежащие выполнению в случае генерации события Exception

В примере Об CancellationAndFaults, который доступен в загружаемом коде для этой книги, рабочий поток определен так, как показано на рис. 36.13. В теле действия tryAndCatch (представляющего собой экземпляр Sequent ialActivity) содержится действие типа CodeActivity, отображающее в окне консоли сообщение о том, что сейчас будет сгенерировано исключение. После него используется действие ThrowActivity для генерации исключения System.ArgumentException. Последнее действие - af terThrow - не выполняется, поскольку исключение к этому моменту уже создано.

Sequential Workflow

Sequential Workflow

I tryAndCatch

a tryAndCatch

faultHandlersActivityl

afterThrow

faultHandlerActivityl

Puc. 36.13. Пример 06 CancellationAndFaults

Исключение ArgumentException перехватывается внутри обработчика неисправностей, после чего снова выполняется действие типа CodeActivity, которое отображает в окне консоли сообщение, но на этот раз о том, что исключение было перехвачено. Наличие такого кода позволяет рабочему потоку продолжать успешно выполняться до самого конца SequenceActivity, потому что любое генерируемое исключение перехватывается и обрабатывается. Обработчики неисправностей могут определяться в любом составном действии, а это означает, что обработчик неисправностей может определяться и в самом рабочем потоке для перехвата любых исключений, которые поступают из действий, выполняющихся внутри него.

В случае отсутствия обработчика на таком высоком уровне, исключения будут выходить за пределы рабочего потока и перехватыватьсяэкземпляром WorkflowRuntime,



1 ... 385 386 387 [ 388 ] 389 390 391 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика