Bagikan melalui


Properti Eksekusi Alur Kerja

Melalui penyimpanan lokal utas (TLS), CLR mempertahankan konteks eksekusi untuk setiap utas. Konteks eksekusi ini mengatur properti utas terkenal seperti identitas utas, transaksi ambien, dan serangkaian izin saat ini yang ditetapkan selain properti utas yang ditentukan pengguna seperti slot bernama.

Tidak seperti program yang secara langsung menargetkan CLR, program alur kerja adalah struktur aktivitas yang diatur secara hierarkis yang dijalankan di lingkungan yang tidak bergantung pada utas. Ini menyiratkan bahwa mekanisme TLS standar tidak dapat langsung digunakan untuk menentukan konteks apa yang ada dalam cakupan untuk item kerja tertentu. Misalnya, dua cabang eksekusi paralel mungkin menggunakan transaksi yang berbeda, namun penjadwal mungkin menginterleaving eksekusinya pada thread CLR yang sama.

Properti eksekusi alur kerja menyediakan mekanisme untuk menambahkan properti khusus konteks ke lingkungan aktivitas. Ini memungkinkan suatu aktivitas untuk mendeklarasikan properti mana yang berada dalam cakupan sub-pohonnya dan juga menyediakan pengait untuk mengkonfigurasi dan membongkar TLS agar dapat beroperasi dengan benar dengan objek CLR.

Membuat dan Menggunakan Properti Pelaksanaan Alur Kerja

Properti eksekusi alur kerja biasanya menerapkan IExecutionProperty antarmuka, meskipun properti yang berfokus pada olahpesan dapat diterapkan ISendMessageCallback dan IReceiveMessageCallback sebagai gantinya. Untuk membuat properti eksekusi alur kerja, buat kelas yang mengimplementasikan IExecutionProperty antarmuka dan menerapkan anggota SetupWorkflowThread dan CleanupWorkflowThread. Anggota ini memberikan properti eksekusi kesempatan untuk menyiapkan dan meruntuhkan penyimpanan lokal thread dengan benar selama setiap siklus pekerjaan dari aktivitas yang berisi properti tersebut, termasuk aktivitas anak apa pun. Dalam contoh ini, dibuat ConsoleColorProperty untuk mengatur Console.ForegroundColor.

class ConsoleColorProperty : IExecutionProperty  
{  
    public const string Name = "ConsoleColorProperty";  
  
    ConsoleColor original;  
    ConsoleColor color;  
  
    public ConsoleColorProperty(ConsoleColor color)  
    {  
        this.color = color;  
    }  
  
    void IExecutionProperty.SetupWorkflowThread()  
    {  
        original = Console.ForegroundColor;  
        Console.ForegroundColor = color;  
    }  
  
    void IExecutionProperty.CleanupWorkflowThread()  
    {  
        Console.ForegroundColor = original;  
    }  
}  

Penulis aktivitas dapat menggunakan properti ini dengan mendaftarkannya dalam fungsi 'execute' pada aktivitas. Dalam contoh ini, sebuah aktivitas ConsoleColorScope didefinisikan untuk mendaftarkan ConsoleColorProperty dengan menambahkannya ke koleksi Properties pada NativeActivityContext saat ini.

public sealed class ConsoleColorScope : NativeActivity  
{  
    public ConsoleColorScope()  
        : base()  
    {  
    }  
  
    public ConsoleColor Color { get; set; }  
    public Activity Body { get; set; }  
  
    protected override void Execute(NativeActivityContext context)  
    {  
        context.Properties.Add(ConsoleColorProperty.Name, new ConsoleColorProperty(this.Color));  
  
        if (this.Body != null)  
        {  
            context.ScheduleActivity(this.Body);  
        }  
    }  
}  

Ketika aktivitas memulai fase kerja, metode dari properti SetupWorkflowThread dipanggil, dan ketika fase kerja selesai, CleanupWorkflowThread dipanggil. Dalam contoh ini, alur kerja dibuat yang menggunakan Parallel aktivitas dengan tiga cabang. Dua cabang pertama menggunakan aktivitas ConsoleColorScope dan cabang ketiga tidak. Ketiga cabang tersebut berisi dua WriteLine kegiatan dan satu Delay aktivitas. Ketika aktivitas Parallel dijalankan, aktivitas yang terkandung dalam cabang dijalankan secara bergantian, secara tidak bersamaan, dan ketika setiap aktivitas anak dijalankan, warna konsol yang benar diterapkan oleh ConsoleColorProperty.

Activity wf = new Parallel  
{  
    Branches =
    {  
        new ConsoleColorScope  
        {  
            Color = ConsoleColor.Blue,  
            Body = new Sequence  
            {  
                Activities =
                {  
                    new WriteLine  
                    {  
                        Text = "Start blue text."  
                    },  
                    new Delay  
                    {  
                        Duration = TimeSpan.FromSeconds(1)  
                    },  
                    new WriteLine  
                    {  
                        Text = "End blue text."  
                    }  
                }  
            }  
        },  
        new ConsoleColorScope  
        {  
            Color = ConsoleColor.Red,  
            Body = new Sequence  
            {  
                Activities =
                {  
                    new WriteLine  
                    {  
                        Text = "Start red text."  
                    },  
                    new Delay  
                    {  
                        Duration = TimeSpan.FromSeconds(1)  
                    },  
                    new WriteLine  
                    {  
                        Text = "End red text."  
                    }  
                }  
            }  
        },  
        new Sequence  
        {  
            Activities =
            {  
                new WriteLine  
                {  
                    Text = "Start default text."  
                },  
                new Delay  
                {  
                    Duration = TimeSpan.FromSeconds(1)  
                },  
                new WriteLine  
                {  
                    Text = "End default text."  
                }  
            }  
        }  
    }  
};  
  
WorkflowInvoker.Invoke(wf);  

Saat alur kerja dipanggil, output berikut ditulis ke jendela konsol.

Start blue text.  
Start red text.  
Start default text.  
End blue text.  
End red text.  
End default text.  

Nota

Meskipun tidak ditampilkan di output sebelumnya, setiap baris teks di jendela konsol ditampilkan dalam warna yang ditunjukkan.

Properti eksekusi alur kerja dapat digunakan oleh penulis aktivitas kustom, dan juga menyediakan mekanisme untuk pengelolaan aktivitas seperti CorrelationScope dan TransactionScope.

Lihat juga