Bagikan melalui


ParallelForEach tidak generik

.NET Framework 4.6.1 menyediakan dalam kotak alatnya serangkaian Control Flow activities, termasuk ParallelForEach<T>, yang memungkinkan iterasi melalui koleksi IEnumerable<T>.

ParallelForEach<T> mengharuskan propertinya Values berjenis IEnumerable<T>. Ini menghalangi pengguna dari iterasi melalui struktur data yang menerapkan IEnumerable<T> antarmuka (misalnya, ArrayList). Versi ParallelForEach<T> yang tidak generik mengatasi persyaratan ini, dengan meningkatkan kompleksitas runtime untuk memastikan kompatibilitas tipe dari nilai-nilai dalam koleksi.

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

Aktivitas ParallelForEach

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

ParallelForEach<T> memiliki CompletionCondition, sehingga aktivitas ParallelForEach<T> dapat diselesaikan lebih awal jika evaluasi CompletionCondition menghasilkan true. CompletionCondition dievaluasi setelah setiap iterasi selesai.

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

Definisi kelas

Contoh kode berikut menunjukkan definisi aktivitas non-generik ParallelForEach adalah.

[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)
Objek ActivityAction dari tipe Object, yang dieksekusi untuk setiap elemen dalam koleksi. Setiap elemen individu diteruskan ke Tubuh melalui properti Argumen.

Nilai (opsional)
Pengumpulan elemen yang diulang. Menjamin bahwa semua elemen dalam koleksi memiliki jenis yang kompatibel dilakukan pada waktu saat program berjalan.

KondisiPenyelesaian (opsional)
Properti CompletionCondition dievaluasi setelah perulangan selesai. Jika dievaluasi ke true, maka iterasi terjadwal yang tertunda dibatalkan. Jika properti ini tidak diatur, semua aktivitas dalam kumpulan aktivitas Cabang akan dijalankan sampai terselesaikan.

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)))
           }
       }
   };

Perancang ParallelForEach

Perancang aktivitas pada contoh ini mirip dengan tampilan perancang yang disediakan untuk aktivitas bawaan ParallelForEach<T>. Perancang muncul di kotak alat di kategori Sampel, Aktivitas Non-Generik . Perancang diberi nama ParallelForEachWithBodyFactory di kotak alat, karena aktivitas mengekspos IActivityTemplateFactory di kotak alat yang membuat aktivitas dengan konfigurasi ActivityAction yang 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. Bangun dan jalankan proyek.