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

  • campos9896

    campos9896

    24 Mart 2012
  • Fullscreen

    Fullscreen

    23 Mart 2006
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010