Bu yöntem bir iptal çirkin olmak için mi?
Şu anda güçlendirme sürecinde uzun süren yöntemlerimiz iptal etmek için bulunuyorum. Sistemi kullanmayı planlıyorum.İş parçacığı.Görevleri.CancellationToken bunu uygulamak için.
Bizim yöntem genellikle uzun süren bir kaç adım (komutları göndermek ve daha sonra donanım için çoğunlukla bekleme), örneğin gerçekleştirmek
void Run()
{
Step1();
Step2();
Step3();
}
Benim ilk (belki de saçma) iptali üzerine bu haline dönüştürmek olacağını düşündüm
bool Run(CancellationToken cancellationToken)
{
Step1(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step2(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step3(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
return true;
}
açıkçası korkunç görünüyor. Bu" tek adımları da (ve mutlaka yerine uzunca zaten onlar). içinde devam edeceğini "desen Bu konu olur.() İptal değil tavsiye. biliyorum rağmen oldukça seksi,
Temiz bir desen klişe çok fazla kod altında uygulama mantığı saklanacak değil, bunu başarmak için var mı?
Edit
Adımları doğası için bir örnek olarak, Run
yöntem okuyabilir
void Run()
{
GiantRobotor.MoveToBase();
Oven.ThrowBaguetteTowardsBase();
GiantRobotor.CatchBaguette();
// ...
}
Birlikte çalışmak eşitlenmesi gereken kontrol farklı donanım birimleri.
CEVAP
Adımları yöntemi içinde veri akışı ile ilgili bir şekilde independend, ama paralel bir konuda idam edilemez ise, aşağıdaki yaklaşım daha iyi okunabilir olabilir:
void Run()
{
// list of actions, defines the order of execution
var actions = new List<Action<CancellationToken>>() {
ct => Step1(ct),
ct => Step2(ct),
ct => Step3(ct)
};
// execute actions and check for cancellation token
foreach(var action in actions)
{
action(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
}
return true;
}
Eğer adımları onları küçük birimler halinde bölebilirsiniz çünkü iptal belirteci gerek yok eğer doğru değilse, daha küçük bir liste tanımı yazabilirsiniz:
var actions = new List<Action>() {
Step1, Step2, Step3
};
Nasıl böyle büyük mükafat bir yöntem i...
Neden önemli GetHashCode yöntem geçers...
Ne'In PHP?ile kullanıcı girişi st...
Genel yöntem oluşturmak bir Numaralama...
Java singleton deseni uygulamak için e...