Bagikan melalui


Komposit Kustom menggunakan Aktivitas Asli

Sampel CustomCompositeNativeActivity menunjukkan cara menulis NativeActivity yang menjadwalkan objek Activity lain untuk mengontrol alur eksekusi alur kerja. Sampel ini menggunakan dua alur kontrol umum, Urutan dan Sementara, untuk menunjukkan cara melakukan ini.

Detail Sampel

Dimulai dengan MySequence, hal pertama yang perlu diperhatikan adalah bahwa itu berasal dari NativeActivity. NativeActivity adalah objek Activity yang mengekspos luasnya runtime bahasa umum alur kerja melalui NativeActivityContext yang diteruskan ke metode Execute.

MySequence mengekspos kumpulan objek Activity publik yang diisi oleh penulis alur kerja. Sebelum alur kerja dijalankan, runtime bahasa umum alur kerja memanggil metode CacheMetadata pada setiap aktivitas dalam alur kerja. Selama proses ini, runtime bahasa umum menetapkan hubungan induk-turunan untuk cakupan data dan manajemen seumur hidup. Implementasi default metode CacheMetadatamenggunakan kelas instans TypeDescriptor untuk aktivitas MySequence guna menambahkan properti publik jenis Activity atau IEnumerable<Activity> sebagai turunan aktivitas MySequence.

Setiap kali aktivitas mengekspos kumpulan aktivitas turunan publik, kemungkinan aktivitas turunan tersebut berbagi status. Ini adalah praktik terbaik untuk aktivitas induk, dalam hal MySequence ini, untuk juga mengekspos kumpulan variabel tempat aktivitas turunan dapat menyelesaikan ini. Seperti aktivitas turunan, metode CacheMetadata menambahkan properti publik jenis Variable atau IEnumerable<Variable> sebagai variabel yang terkait dengan aktivitas MySequence.

Selain variabel publik, yang dimanipulasi oleh turunan MySequence, MySequence juga harus melacak di mana variabel berada dalam eksekusi turunannya. Ia menggunakan variabel privat, currentIndex, untuk mencapai hal ini. Variabel ini terdaftar sebagai bagian dari lingkungan MySequence dengan menambahkan panggilan ke metode AddImplementationVariable dalam metode CacheMetadata dari aktivitas MySequence. Objek Activity yang ditambahkan ke kumpulan MySequenceActivities tidak dapat mengakses variabel yang ditambahkan dengan cara ini.

Ketika MySequence dijalankan oleh runtime bahasa umum, runtime bahasa umum tersebut memanggil metode Execute miliknya, lalu meneruskan NativeActivityContext. NativeActivityContext adalah proksi aktivitas kembali ke runtime bahasa umum untuk mendereferensiasikan argumen dan variabel serta menjadwalkan objek Activity lain, atau ActivityDelegates. MySequence menggunakan metode InternalExecute untuk merangkum logika penjadwalan turunan pertama dan semua turunan berikutnya dalam satu metode. Metode ini memulai dengan mendereferensiasikan currentIndex. Jika sama dengan hitungan dalam kumpulan Activities, urutan akan selesai, aktivitas akan kembali tanpa menjadwalkan pekerjaan apa pun, dan runtime bahasa umum memindahkannya ke status Closed. Jika currentIndex kurang dari jumlah aktivitas, turunan berikutnya diperoleh dari kumpulan Activities dan MySequence memanggil ScheduleActivity, meneruskan turunan untuk dijadwalkan dan CompletionCallback yang mengacu pada metode InternalExecute. Terakhir, currentIndex dinaikkan dan kontrol dihasilkan kembali ke runtime bahasa umum. Selama instans MySequence memiliki objek Activity turunan yang dijadwalkan, runtime bahasa umum menganggapnya berada dalam status Menjalankan.

Ketika aktivitas turunan selesai, CompletionCallback akan dijalankan. Perulangan berlanjut dari atas. Seperti Execute, CompletionCallback mengambil NativeActivityContext, memberikan akses pengimplementasi ke runtime bahasa umum.

MyWhile berbeda dari MySequence karena menjadwalkan satu objek Activity berulang kali, dan karena itu menggunakan Activity<TResult><bool> bernama Condition untuk menentukan apakah penjadwalan ini harus terjadi. Seperti MySequence, MyWhile menggunakan metode InternalExecute untuk memusatkan logika penjadwalannya. Ia menjadwalkan ConditionActivity<bool> dengan CompletionCallback<TResult><bool> bernama OnEvaluationCompleted. Ketika eksekusi Condition selesai, hasilnya tersedia melalui CompletionCallback ini dalam parameter strongly typed bernama result. Jika true, MyWhile memanggil ScheduleActivity, meneruskan objek BodyActivity dan InternalExecute sebagai CompletionCallback. Ketika eksekusi Body selesai, Condition dijadwalkan lagi di InternalExecute, sehingga memulai perulangan lagi. Ketika Condition menampilkan false, instans MyWhile memberikan kontrol kembali ke runtime bahasa umum tanpa menjadwalkan Body dan runtime bahasa umum memindahkannya ke status Closed.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Buka solusi sampel Composite.sln di Visual Studio.

  2. Membangun dan menjalankan solusi.