Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penanda adalah mekanisme yang memungkinkan suatu aktivitas untuk menunggu masukan secara pasif tanpa harus mempertahankan utas dalam alur kerja. Ketika sebuah aktivitas memberi sinyal bahwa aktivitas itu sedang menunggu stimulus, aktivitas tersebut dapat membuat penanda. Ini menunjukkan kepada runtime bahwa eksekusi aktivitas tidak boleh dianggap selesai bahkan ketika metode yang sedang dijalankan (yang membuat Bookmark) kembali.
Dasar-Dasar Bookmark
Bookmark mewakili titik di mana eksekusi dapat dilanjutkan (dan di mana input dapat diberikan) dalam instans alur kerja. Biasanya, Bookmark diberi nama dan kode eksternal (host atau ekstensi) bertanggung jawab untuk meneruskan penanda dengan data yang relevan. Ketika sebuah Bookmark dilanjutkan, runtime alur kerja menjadwalkan delegasi BookmarkCallback yang terkait dengan Bookmark tersebut pada saat pembuatannya.
Opsi Marka Buku
Kelas BookmarkOptions menentukan jenis Bookmark yang dibuat. Kemungkinan nilai yang tidak saling eksklusif adalah None, , MultipleResumedan NonBlocking. Gunakan None, sebagai pengaturan default, saat membuat Bookmark yang diharapkan untuk dilanjutkan tepat satu kali. Gunakan MultipleResume saat membuat Bookmark yang bisa dilanjutkan berkali-kali. Gunakan NonBlocking saat membuat Bookmark yang mungkin tidak akan pernah dilanjutkan. Tidak seperti penanda buku yang dibuat menggunakan penanda buku default BookmarkOptions, penanda NonBlocking tidak menghentikan aktivitas untuk selesai.
Pencadangan Bookmark
Penanda dapat dilanjutkan dengan kode di luar alur kerja menggunakan salah satu overload ResumeBookmark. Dalam contoh ini, sebuah aktivitas ReadLine
dibuat. Saat dijalankan, aktivitas ReadLine
membuat Bookmark, mendaftarkan callback, lalu menunggu Bookmark untuk dilanjutkan. Ketika dilanjutkan, aktivitas ReadLine
menetapkan data yang dioper ke Bookmark sebagai argumen Result.
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);
}
}
Dalam contoh ini, alur kerja dibuat yang menggunakan ReadLine
aktivitas untuk mengumpulkan nama pengguna dan menampilkannya ke jendela konsol. Aplikasi host melakukan pekerjaan aktual untuk mengumpulkan input dan meneruskannya ke alur kerja dengan melanjutkan Bookmark.
Variable<string> name = new Variable<string>
{
Name = "name"
};
Activity wf = new Sequence
{
Variables =
{
name
},
Activities =
{
new WriteLine()
{
Text = "What is your name?"
},
new ReadLine()
{
BookmarkName = "UserName",
Result = name
},
new WriteLine()
{
Text = new InArgument<string>((env) => "Hello, " + name.Get(env))
}
}
};
AutoResetEvent syncEvent = new AutoResetEvent(false);
// Create the WorkflowApplication using the desired
// workflow definition.
WorkflowApplication wfApp = new WorkflowApplication(wf);
// Handle the desired lifecycle events.
wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
{
// Signal the host that the workflow is complete.
syncEvent.Set();
};
// Start the workflow.
wfApp.Run();
// Collect the user's name and resume the bookmark.
// Bookmark resumption only occurs when the workflow
// is idle. If a call to ResumeBookmark is made and the workflow
// is not idle, ResumeBookmark blocks until the workflow becomes
// idle before resuming the bookmark.
wfApp.ResumeBookmark("UserName", Console.ReadLine());
// Wait for Completed to arrive and signal that
// the workflow is complete.
syncEvent.WaitOne();
Ketika aktivitas ReadLine
dijalankan, aktivitas tersebut membuat Bookmark yang bernama UserName
dan kemudian menunggu bookmark dilanjutkan. Host mengumpulkan data yang diinginkan dan kemudian melanjutkan Bookmark. Alur kerja dilanjutkan, menampilkan nama, lalu selesai. Perhatikan bahwa sehubungan dengan melanjutkan penanda, tidak diperlukan kode sinkronisasi. Hanya Bookmark dapat dilanjutkan ketika alur kerja berhenti, dan jika alur kerja tidak berhenti, maka panggilan ke ResumeBookmark akan tertahan sampai alur kerja berhenti.
Hasil Lanjutan Penandaan
ResumeBookmark BookmarkResumptionResult mengembalikan nilai enumerasi untuk menunjukkan hasil permintaan kelanjutan penanda buku. Nilai pengembalian yang mungkin adalah Success, NotReady, dan NotFound. Host dan ekstensi dapat menggunakan nilai ini untuk menentukan cara melanjutkan.