Bagikan melalui


Non-generic ParallelForEach

.NET Framework 4.6.1 mengirimkan serangkaian aktivitas Alur Kontrol dalam kotak alatnya, termasuk ParallelForEach<T>, yang memungkinkan pengulangan melalui koleksi IEnumerable<T>.

ParallelForEach<T> mengharuskan properti Values-nya berjenis IEnumerable<T>. Ini menghalangi pengguna untuk mengulangi struktur data yang mengimplementasikan antarmuka IEnumerable<T> (misalnya, ArrayList). Versi non-generik ParallelForEach<T> mengatasi persyaratan ini, dengan mengorbankan kompleksitas run-time yang lebih banyak untuk memastikan kompatibilitas jenis nilai dalam koleksi.

Sampel NonGenericParallelForEach menunjukkan cara mengimplementasikan aktivitas ParallelForEach<T> non-generik dan perancangnya. Aktivitas ini dapat digunakan untuk beralih melalui ArrayList.

Aktivitas ParallelForEach

Pernyataan C#/Visual Basic foreach menghitung elemen koleksi, mengeksekusi pernyataan yang disematkan untuk setiap elemen koleksi. Aktivitas yang setara dengan WF adalah ForEach<T> dan ParallelForEach<T>. Aktivitas ForEach<T> berisi daftar nilai dan isi. Pada durasi, daftar diulang dan isi dijalankan untuk setiap nilai dalam daftar.

ParallelForEach<T> memiliki CompletionCondition, sehingga aktivitas ParallelForEach<T> bisa selesai lebih awal saat evaluasi CompletionCondition mengembalikan true. CompletionCondition dievaluasi setelah setiap perulangan.

Untuk sebagian besar kasus, versi generik aktivitas harus menjadi solusi yang disukai, karena mencakup sebagian besar skenario di mana ia digunakan dan menyediakan pemeriksaan jenis pada waktu kompilasi. Versi non-generik dapat digunakan untuk iterasi melalui tipe yang mengimplementasikan antarmuka IEnumerable non-generik.

Definisi kelas

Contoh kode berikut menunjukkan definisi aktivitas ParallelForEach non-generik.

[ContentProperty("Body")]
public class ParallelForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    public Activity<bool> CompletionCondition
    [DefaultValue(null)]
    [DependsOn("CompletionCondition")]
    ActivityAction<object> Body { get; set; }
}

Isi (opsional)
ActivityAction dari jenis Object, yang dijalankan untuk setiap elemen dalam koleksi. Setiap elemen individu diteruskan ke dalam Isi melalui properti Argumennya.

Nilai (opsional)
Kumpulan elemen yang diulang. Memastikan bahwa semua elemen koleksi adalah jenis yang kompatibel dilakukan pada saat run-time.

CompletionCondition (opsional)
Properti CompletionCondition dievaluasi setelah perulangan selesai. Jika dievaluasi ke true, maka perulangan terjadwal yang tertunda dibatalkan. Jika properti ini tidak diatur, semua aktivitas dalam koleksi Cabang dijalankan hingga selesai.

Contoh penggunaan ParallelForEach

Kode berikut menunjukkan cara menggunakan aktivitas ParallelForEach dalam aplikasi.

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ParallelForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object>
       {
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };

ParallelForEach designer

Perancang aktivitas untuk sampel memiliki tampilan yang mirip dengan perancang yang disediakan untuk aktivitas ParallelForEach<T> bawaan. Perancang muncul di kotak alat dalam kategori Sampel, Aktivitas Non-Generik. Perancang diberi nama ParallelForEachWithBodyFactory di kotak alat, karena aktivitas mengekspos IActivityTemplateFactory di kotak alat yang membuat aktivitas dengan dikonfigurasi ActivityAction benar.

public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ParallelForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

Untuk menjalankan sampel

  1. Tetapkan proyek pilihan Anda sebagai proyek startup solusi.

    1. CodeTestClient menunjukkan cara menggunakan aktivitas menggunakan kode.

    2. DesignerTestClient menunjukkan cara menggunakan aktivitas dalam perancang.

  2. Buat dan jalankan proyek.