Saya mencoba merancang kelas yang memperlihatkan kemampuan untuk menambahkan masalah pemrosesan asinkron. Dalam pemrograman sinkron, ini mungkin terlihat seperti
public class ProcessingArgs : EventArgs
{
public int Result { get; set; }
}
public class Processor
{
public event EventHandler<ProcessingArgs> Processing { get; }
public int Process()
{
var args = new ProcessingArgs();
Processing?.Invoke(args);
return args.Result;
}
}
var processor = new Processor();
processor.Processing += args => args.Result = 10;
processor.Processing += args => args.Result+=1;
var result = processor.Process();
di dunia asinkron, di mana setiap masalah mungkin perlu mengembalikan tugas, ini tidak begitu sederhana. Saya telah melihat ini melakukan banyak cara, tetapi saya ingin tahu apakah ada praktik terbaik yang ditemukan orang. Satu kemungkinan sederhana adalah
public class Processor
{
public IList<Func<ProcessingArgs, Task>> Processing { get; } =new List<Func<ProcessingArgs, Task>>();
public async Task<int> ProcessAsync()
{
var args = new ProcessingArgs();
foreach(var func in Processing)
{
await func(args);
}
return args.Result
}
}
Adakah "standar" yang digunakan orang untuk hal ini? Tampaknya tidak ada pendekatan konsisten yang saya amati di seluruh API populer.
c#
asynchronous
async-await
Jeff
sumber
sumber
ProcessingArgs
jadi saya bingung tentang itu.Jawaban:
Delegasi berikut akan digunakan untuk menangani masalah implementasi asinkron
Dari komentar itu ditunjukkan
Kelas berikut memungkinkan untuk membangun delegasi untuk menangani langkah-langkah tersebut dengan cara yang mirip dengan .net core middleware
Ekstensi berikut memungkinkan pengaturan in-line yang lebih sederhana menggunakan pembungkus
Ini dapat diperpanjang lebih lanjut sesuai kebutuhan untuk pembungkus tambahan.
Contoh kasus penggunaan delegasi dalam aksi ditunjukkan dalam tes berikut
sumber
Jika Anda ingin menjadikannya sebagai delegasi, Anda dapat:
sumber