Bagikan melalui


Penanda Halaman

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.