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 MySequence
Activities
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 Condition
Activity<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 Body
Activity 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
Buka solusi sampel Composite.sln di Visual Studio.
Membangun dan menjalankan solusi.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk