2013-03-03 14 views
7

http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx'a göre, unsafe anahtar sözcüğünde, yalnızca 'yönetilmeyen göstergelerin korunmasında karşılaşılan zorluklardan' bahsetmeden, await anahtar sözcüğü yasaklanmıştır. Bu zorlukların ne olduğu konusunda iyi bir açıklama var mı?Güvensiz bölümlerde neden bekleme yasaktır?

+4

Daha fazla detay ne istiyorsunuz? Güvenli olmayan bloklarda kullanamazsın. –

+0

@MitchWheat Kabul ediyorum Burada anlıyorum ama belki OP ne anlama geldiği hakkında bilgi arıyor *. –

+1

Bu, orada kullanamayacağınız anlamına gelir! Ayrıntılı bir açıklama ile bile, hala orada kullanamazsınız. Belki de OP, çözmeye çalıştıkları sorunu açıklamalıdır. –

cevap

7

Bilmeniz gereken iki temel şey. Bir async yöntemi C# derleyicisi tarafından, bir durum makinesini saran, bilinmeyen bir adla küçük bir sınıfa yeniden yazılır. Async yönteminin yerel değişkenleri o sınıfın alanları olur.

Güvenli olmayan kodlar çoğunlukla yerel değişkenlere işaretçiler oluşturabiliyor. sabit ifadesi, çöp toplayıcısının görebileceği gizli bir yerel değişken yaratır ve böylece sabitlenen diziyi hareket ettiren bir çöp toplama işlemi gerçekleştiğinde güncellenir. Yerel değişkenlere işaretçiler oluşturmak iyidir, bu değişkenler çöp toplayıcı tarafından taşınmaya tabi değildir. Bir iş parçacığı yığını, her zaman sanal bellek adres alanındaki sabit bir konumdadır.

İki bağlantıyı bağlayın ve sorunu görüyorsunuz, bir yerel değişken bir sınıf alanına dönüşebilir, bir çöp toplama işlemi gerçekleştiğinde adresi değişiyor. Aniden güvenli olmayan kodun kırılma koduna dönüştürülmesi.

sorunu gösteren bir kod parçacığı:

class Example { 
    int field; 
    unsafe void Method() { 
     int local = 42; 
     int* p = &local; // fine 
     int* q = &field; // CS0212 
    } 
} 

C# takımı dikkatlice güvensiz kod hala yeniden yazma sonra tamamdır sorunların çözümünde çaba olabilirdi. Ancak bazı durumlarda düzeltilemez, sabit bildirimi gibi. Çoğu zaman şaşırtıcı bir sebepten dolayı programcıya hayal kırıklığı yaratan haberler vermek için bir sürü iş. Burada yapılacak aklı başında, güvensiz kodların sınırlarını bildirmesi yeterliydi.

+0

Bu iyi bir fikir. Bu, utanç verici durum makinesinin basitçe 'sabit' olarak (isteğe bağlı olarak, varsayalım) açıklanamaz ve onunla yapılabilir. Çözüm, ihtiyacınız olan kapatma değişkenlerini bir sınıfa açıkça ayırmak, bu sınıfı düzeltmek ve ona uygun parçaları göndermektir. Ama bu async rewriter sihirbazının faydasının yarısını veriyor. Bu bir utanç! –