SORU
18 EKİM 2012, PERŞEMBE


Resharper: Örtülü olarak yakalanan kapatma: bu

Bu uyarı alıyorum ("İmplicity yakalanan kapatılması:" bu Resharper: bu şekilde bu kod, tüm kapsayan nesne yakalama anlamına mı geliyor?

    internal Timer Timeout = new Timer
                            {
                                Enabled = false,
                                AutoReset = false
                            };
    public Task<Response> ResponseTask
    {
        get
        {
            var tcs = new TaskCompletionSource<Response>();

            Timeout.Elapsed  = (e, a) => tcs.SetException(new TimeoutException("Timeout at "   a.SignalTime));

            if (_response != null) tcs.SetResult(_response);
            else ResponseHandler  = r => tcs.SetResult(_response);
            return tcs.Task;
        }
    }

Bunu yaparken nasıl emin değilim - yakalama olacaktır tek değişken kasıtlı olan TaskCompletionSource. Bu aslında bir sorun ve nasıl bu çözme hakkında gitmek istiyorsunuz?

EDİT: uyarı ilk lambda (zaman Aşımı olayı).

CEVAP
18 EKİM 2012, PERŞEMBE


Sorun sanırım hat yok gibi görünüyor.

Sorun iki Lambda ana nesne alanları başvuran var: derleyici iki yöntem ve üst sınıf için bir referans (this) ile bir sınıf oluşturur.

Bu this referansı etrafında TaskCompletionSource nesne, GCed, onu engelleyen kalabilir çünkü potansiyel bir sorun olacağını düşünüyorum. En azından bu sorunu ortaya koyuyor buldum.

Üretilen sınıfın böyle bir şey (tabii ki isimler farklı ve telaffuz edilemeyen) görünecektir:

class GeneratedClass {
    Request _this;
    TaskCompletionSource tcs;

    public lambda1 (Object e, ElapsedEventArgs a) {
        tcs.SetException(new TimeoutException("Timeout at "   a.SignalTime));
    }

    public lambda2 () {
        tcs.SetResult(_this._response);
    }
}

Sebebi derleyicinin yaptığı bu muhtemelen verimliliği, sanırım, gibi TaskCompletionSource kullanılan her iki Lambda; ama şimdi sürece bir başvuru için bir tane Lambda hala başvurulan referans için Request nesne de sürdürdü.

Hala bu sorunu önlemek için nasıl bulmaktan daha yakın ama.

EDİT: kesinlikle ben yazarken bunu hiç düşünmemiştim. Bu şekilde yöntem değiştirerek sorunu çözdüm:

    public Task<Response> TaskResponse
    {
        get
        {
            var tcs = new TaskCompletionSource<Response>();

            Timeout.Elapsed  = (e, a) => tcs.SetException(new TimeoutException("Timeout at "   a.SignalTime));

            if (_response != null) tcs.SetResult(_response);
            else ResponseHandler  = tcs.SetResult; //The event passes an object of type Response (derp) which is then assigned to the _response field.
            return tcs.Task;
        }
    }

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andony5589

    andony5589

    7 Aralık 2011
  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • TechBalance

    TechBalance

    12 HAZİRAN 2011