Arsitektur Alur Kerja Windows

Windows Workflow Foundation (WF) meningkatkan tingkat abstraksi untuk mengembangkan aplikasi interaktif yang berjalan lama. Unit kerja dienkapsulasi sebagai aktivitas. Aktivitas berjalan di lingkungan yang menyediakan fasilitas untuk kontrol alur, penanganan pengecualian, penyebaran kesalahan, persistensi data status, pemuatan dan pembongkaran alur kerja yang sedang berlangsung dari memori, pelacakan, dan alur transaksi.

Arsitektur Aktivitas

Aktivitas dikembangkan sebagai jenis CLR yang berasal dari Activity, , CodeActivity, AsyncCodeActivityatau NativeActivity, atau variannya yang mengembalikan nilai, , Activity<TResult>CodeActivity<TResult>, AsyncCodeActivity<TResult>, atau NativeActivity<TResult>. Mengembangkan aktivitas yang berasal dari Activity memungkinkan pengguna untuk merakit aktivitas yang sudah ada sebelumnya untuk dengan cepat membuat unit pekerjaan yang dijalankan di lingkungan alur kerja. CodeActivity, di sisi lain, memungkinkan logika eksekusi ditulis dalam kode terkelola menggunakan CodeActivityContext terutama untuk akses ke argumen aktivitas. AsyncCodeActivity mirip dengan CodeActivity kecuali dapat digunakan untuk menerapkan tugas asinkron. Mengembangkan aktivitas yang berasal dari NativeActivity memungkinkan pengguna mengakses runtime melalui NativeActivityContext untuk fungsionalitas seperti menjadwalkan aktivitas turunan, membuat penanda, memanggil pekerjaan asinkron, mendaftarkan transaksi, dan banyak lagi.

Aktivitas penulisan yang berasal dari Activity bersifat deklaratif dan aktivitas ini dapat ditulis di XAML. Dalam contoh berikut, dibuat sebuah aktivitas yang disebut Prompt dengan menggunakan aktivitas lain untuk isi eksekusinya.

<Activity x:Class='Prompt'
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
    xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="http://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
  <z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />
  <z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
  <Sequence>
    <my:WriteLine Text='[Text]' />
    <my:ReadLine BookmarkName='r1' Result='[Response]' />
  </Sequence>
</Activity>

Konteks Aktivitas

ActivityContext adalah antarmuka penulis aktivitas untuk runtime alur kerja dan menyediakan akses ke beragam fitur yang dimiliki runtime. Dalam contoh berikut, aktivitas yang didefinisikan menggunakan konteks eksekusi untuk membuat marka buku (mekanisme yang memungkinkan aktivitas untuk mendaftarkan titik kelanjutan dalam eksekusinya yang dapat dilanjutkan oleh host yang meneruskan data ke aktivitas).

public sealed class ReadLine : NativeActivity<string>
{
    [RequiredArgument]
    public InArgument<string> BookmarkName { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        // Create a Bookmark and wait for it to be resumed.
        context.CreateBookmark(BookmarkName.Get(context),
            new BookmarkCallback(OnResumeBookmark));
    }

    // NativeActivity derived activities that do asynchronous operations by calling
    // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
    // must override the CanInduceIdle property and return true.
    protected override bool CanInduceIdle
    {
        get { return true; }
    }

    public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
    {
        // When the Bookmark is resumed, assign its value to
        // the Result argument.
        Result.Set(context, (string)obj);
    }

Siklus Hidup Aktivitas

Sebuah contoh aktivitas dimulai dalam keadaan Executing. Kecuali jika ditemukan pengecualian, itu tetap dalam keadaan ini sampai semua aktivitas anak selesai dijalankan dan pekerjaan tertunda lainnya (Bookmark objek, misalnya) selesai, di mana itu beralih ke status Closed. Induk instans aktivitas dapat meminta anak untuk membatalkan; jika anak dapat dibatalkan, ia selesai dalam Canceled status . Jika pengecualian dilemparkan selama eksekusi, runtime akan menempatkan aktivitas tersebut ke dalam keadaan Faulted dan menyebarluaskan pengecualian ke atas rantai induk dari aktivitas-aktivitas. Berikut ini adalah tiga status penyelesaian aktivitas:

  • Tertutup: Aktivitas telah menyelesaikan tugasnya dan ditutup.

  • Dibatalkan: Aktivitas ini telah dengan anggun meninggalkan pekerjaannya dan keluar. Pekerjaan tidak secara eksplisit dibatalkan ketika status ini dicapai.

  • Rusak: Aktivitas mengalami kesalahan dan telah keluar tanpa menyelesaikan pekerjaannya.

Aktivitas tetap dalam status Executing saat disimpan atau dilepas.