Bagikan melalui


Bookmark

Marka buku adalah mekanisme yang memungkinkan aktivitas untuk secara pasif menunggu input tanpa menahan rangkaian alur kerja. Jika aktivitas memberi sinyal bahwa ini sedang menunggu stimulus, marka buku dapat dibuat. Ini menunjukkan kepada runtime bahwa eksekusi aktivitas tidak boleh dianggap selesai bahkan saat metode yang saat ini dijalankan (yang membuat Bookmark) muncul.

Dasar-Dasar Marka Buku

Bookmark adalah titik di mana eksekusi dapat dilanjutkan (dan melaluinya input dapat dikirimkan) dalam instans alur kerja. Biasanya, Bookmark diberi nama dan kode eksternal (host atau ekstensi) bertanggung jawab untuk melanjutkan marka buku dengan data yang relevan. Saat Bookmark dilanjutkan, runtime alur kerja menjadwalkan delegasi BookmarkCallback yang dikaitkan dengan Bookmark tersebut pada waktu pembuatannya.

Opsi Marka Buku

Kelas BookmarkOptions menentukan jenis Bookmark yang dibuat. Kemungkinan nilai yang tidak saling eksklusif adalah None, MultipleResume, dan NonBlocking. Gunakan None, default, saat membuat Bookmark yang diharapkan dilanjutkan hanya sekali. Gunakan MultipleResume saat membuat Bookmark yang dapat dilanjutkan beberapa kali. Gunakan NonBlocking saat membuat Bookmark yang mungkin tidak pernah dilanjutkan. Tidak seperti marka buku yang dibuat menggunakan BookmarkOptions default, marka buku NonBlocking tidak mencegah penyelesaian aktivitas.

Kelanjutan Marka Buku

Marka Buku dapat dilanjutkan dengan kode di luar alur kerja menggunakan salah satu muatan berlebih ResumeBookmark. Dalam contoh ini, aktivitas ReadLine dibuat. Saat dijalankan, aktivitas ReadLine membuat Bookmark, mendaftarkan panggilan balik, lalu menunggu Bookmark untuk dilanjutkan. Saat dilanjutkan, aktivitas ReadLine menetapkan data yang diteruskan dengan Bookmark ke argumen Result-nya.

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 aktivitas ReadLine untuk mengumpulkan nama pengguna dan menampilkannya ke jendela konsol. Aplikasi host melakukan pekerjaan aktual 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();  

Saat aktivitas ReadLine dijalankan, Bookmark bernama UserName dibuat dan menunggu marka buku untuk dilanjutkan. Host mengumpulkan data yang diinginkan dan kemudian melanjutkan Bookmark. Alur kerja dilanjutkan, menampilkan nama, dan kemudian selesai. Perhatikan bahwa kode sinkronisasi tidak diperlukan saat melanjutkan marka buku. Bookmark hanya dapat dilanjutkan saat alur kerja menganggur, dan jika alur kerja tidak menganggur, panggilan ke ResumeBookmark akan diblokir hingga alur kerja menjadi menganggur.

Hasil Kelanjutan Marka Buku

ResumeBookmark menampilkan nilai enumerasi BookmarkResumptionResult untuk menunjukkan hasil permintaan kelanjutan marka buku. Kemungkinan nilai yang ditampilkan adalah Success, NotReady, dan NotFound. Host dan ekstensi dapat menggunakan nilai ini untuk menentukan cara melanjutkan.