Gustavo님의 프로필Gustavo Bonansea블로그리스트 도구 도움말
    12월 19일

    Windows Workflow Foundation - Ejemplo simple

    Luego de varios intentos fallidos por instalar WWF, esto es debido a que hay varias versiones de WinFX, Visual Studio Extensions, WinFX Runtime Components, WinFX SDK, etc,etc, y alguno de los que instalé no se llevaba bien con algún otro, opté por desinstalar todo de nuevo y arrancar de cero. Fue así como instalé solo dos cositas y todo terminó feliz:

    Microsoft® Windows® Software Development Kit (SDK) for the November 2005 WinFX® Runtime Components Community Technology Preview (CTP)
    Windows Workflow Foundation Beta 1.2 for Office "12" (Beta 1)

    Luego de bajar algunos ejemplos y que ninguno funcione correctamente (al menos en mi máquina) me decidí a hacer mi propio ejemplo. Paso a compartir con Uds. mi experiencia.

    Creación de un proyecto

    Cuando instalamos las Visual Studio Extensions para WWF se agregan varios templates al VS para ayudarnos a crear nuestros proyectos de workflow.
    En este caso crearemos un Sequential Workflow Console Application como muestra la imagen abajo:



    Esto crea por defecto un proyecto con un archivo Module1.vb que contiene el código de inicialización del workflow:

     

    Imports System

    Imports System.Collections.Generic

    Imports System.Text

    Imports System.Threading

    Imports System.Workflow.Runtime

    Imports System.Workflow.Runtime.Hosting

                     

                     

    Module Module1

        Class Program

            Shared WaitHandle As New AutoResetEvent(False)

                     

            Shared Sub Main()

                Dim workflowRuntime As New WorkflowRuntime()

                workflowRuntime.StartRuntime()

      

                AddHandler workflowRuntime.WorkflowCompleted, AddressOf OnWorkflowCompleted

                     

                Dim type As System.Type = GetType(Workflow1)

                workflowRuntime.StartWorkflow(type)

                     

                WaitHandle.WaitOne()

                     

                workflowRuntime.StopRuntime()

            End Sub

                     

            Shared Sub OnWorkflowCompleted(ByVal sender As Object, ByVal e As WorkflowCompletedEventArgs)

                WaitHandle.Set()

            End Sub

                     

        End Class

    End Module

                     


    Crea además un archivo Workflow1.vb que contiene la definición del workflow cuya declaración de clase es la siguiente:

    Partial Public Class Workflow1

        Inherits SequentialWorkflow

    Esta clase está ligada a la ejecución del workflow, cada actividad que agregemos en el diseñador, eventos que manejemos y demás tendrán su correspondiente código aquí.

    Diseño del flujo

     

    Este workflow utiliza dos tipos de actividades: "Code" e "IfElse". La actividad del tipo Code está ligada a la ejecución directa de código. Veamos el ejemplo de la actividad codeGetInt:

    Esta actividad tiene en la propiedad ExecuteCode el procedimiento que se va a ejecutar cuando el flujo llegue a la misma, que en este caso es "codeGetInt_ExecuteCode":

        Private Sub codeGetInt_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)

            DecisionValue = Integer.Parse(Console.ReadLine())

        End Sub

    El procedimiento lee una línea de la consola, la convierte en un entero y guarda el valor en una variable a nivel de clase denominada "DecisionValue".

    La siguiente instrucción en una del tipo IfElse denominada ifValueDecision que tiene dos caminos posibles (pueden agregarse más). El primer camino posee una condición de evaluación que en caso de ser verdadera hace que el flujo alcance las actividades que se encuentran en esa rama. En caso de ser falsa se procesan las actividades del brazo alternativo.

    propiedades del branch de la izquierda

     

    Cada uno de los brazos posee una actividad de tipo Code que escribe un mensaje en la consola:

        Private Sub codeLess_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)

            Console.ForegroundColor = ConsoleColor.Green

            Console.WriteLine("The number is lower than 100")

        End Sub

           

        Private Sub codeMore_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)

            Console.ForegroundColor = ConsoleColor.Blue

            Console.WriteLine("The number is equal or greater than 100")

        End Sub

    Luego termina el flujo.

    Adicional a las ejecuciones de las actividades se sobreescribieron dos eventos del workflow, el de inicialización y de terminación:

        Private Sub Workflow1_Initialized(ByVal sender As System.Object, ByVal e As System.EventArgs)

            Console.WriteLine("Write a number")

        End Sub

           

        Private Sub Workflow1_Completed(ByVal sender As System.Object, ByVal e As System.EventArgs)

            Console.ResetColor()

            Console.WriteLine("Press ENTER to End")

            Console.ReadLine()

        End Sub

    Flujo para excepciones

    Es posible definir un flujo para controlar las excepciones que se producen durante la ejecución. En el presente caso se agregó una actividad "ExcepcionHandler" para que capture las excepciones del tipo "System.FormatExcepcion" que es el error en el cual se incurriría si intentamos parsear como entero algo que no lo es. Cuando el Integer.Parse falla y produce una excepción la ejecución pasa a la actividad exBadValue y luego a la actividad codeInvalidValue que procesa el siguiente código:

        Private Sub codeInvalidValue_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)

            Console.ForegroundColor = ConsoleColor.Red

            Console.WriteLine("You must type an integer")

            Console.ResetColor()

            Console.WriteLine("Press ENTER to End")

            Console.ReadLine()

        End Sub

    Luego termina la ejecución.

    Test

    Veamos ahora que pasa cuando ejecutamos el ejemplo:

     

     

     

    Código:

    SimpleWorkflow.zip

     

    GB

    댓글 (2개)

    잠시만 기다려 주세요...
    죄송합니다. 입력한 댓글이 너무 깁니다. 내용을 줄여 보세요.
    입력한 내용이 없습니다. 다시 시도해 보세요.
    죄송합니다. 지금은 댓글을 추가할 수 없습니다. 나중에 다시 시도해 보세요.
    댓글을 추가하려면 부모님의 사용 허락이 필요합니다. 허용 요청
    부모님이 댓글 기능을 해제한 상태입니다.
    죄송합니다. 지금은 댓글을 삭제할 수 없습니다. 나중에 다시 시도해 보세요.
    하루에 남길 수 있는 댓글의 최대 한도를 초과했습니다. 24시간 후에 다시 시도해 보세요.
    회원님의 계정은 다른 사용자에게 스팸 메일을 보낼 수 있다고 여겨지므로 댓글 기능이 비활성화되어 있습니다. 이 설정에 문제가 있다고 생각되면 Windows Live 지원에 문의하시기 바랍니다.
    댓글을 남기려면 아래 보안 검사를 완료해야 합니다.
    보안 검사에 입력한 글자는 그림 또는 오디오에 있는 글자와 일치해야 합니다.

    댓글을 추가하려면 Windows Live ID로 로그인하세요. 핫메일, 메신저 또는 Xbox LIVE를 사용하는 경우 해당 계정을 Windows Live ID로 사용할 수 있습니다.로그인


    Windows Live ID가 없으신가요? 등록

    알 수 없음님의 사진
    Gustavo_Bonansea 님이 남긴 글:
    Jajajajajajajajaja...... sip, lo conozco.
    La única forma fue desinstalando todo, inclusive el VS2005, reinstalarlo y luego instalar los componentes que señalo arriba.

    Se los perdono porque es un beta... pero...... tiene bastantes errores raros.
    12월 19일
    알 수 없음님의 사진
    El_Bruno_ 님이 남긴 글:
    Supongo que te suena el error :D

    Saludos

    ---------------------------
    Microsoft Visual Studio
    ---------------------------
    Package Load Failure

    Package 'Microsoft.Workflow.VSDesigner.DesignerPackage, Microsoft.Workflow.VSDesigner, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' has failed to load properly ( GUID = {FD526733-BD72-4F81-BEEC-BEB06E2AF59F} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use 'devenv /resetskippkgs' to re-enable package loading.
    ---------------------------
    Yes No
    ---------------------------
    12월 19일

    트랙백

    이 블로그의 트랙백 URL은 다음과 같습니다.
    http://misopiniones.spaces.live.com/blog/cns!2737DC89A4AAB26B!547.trak
    이 블로그를 참조하는 웹 로그
    • 없음