SORU
5 Kasım 2013, Salı


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
5 Kasım 2013, Salı


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DragsterMC Gaming

    DragsterMC G

    30 HAZİRAN 2013
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012