C # neden geçersiz kılma zaman uyumsuz hale getirmenize izin veriyor?


16

C # 'da, bir yöntemi geçersiz kıldığınızda, özgün yöntem olmadığında geçersiz kılma zaman uyumsuz hale getirilmesine izin verilir. Bu zayıf bir form gibi görünüyor.

Beni buna getiren örnek buydu - Bir yük testi problemine yardımcı olmak için getirildim. Yaklaşık 500 eşzamanlı kullanıcıda, oturum açma işlemi bir yönlendirme döngüsünde bozulacaktır. IIS, "Eşzamansız bir işlem beklemedeyken eşzamansız bir modül veya işleyici tamamlandı" iletisiyle özel durumları günlüğe kaydediyordu. Bazı aramalar beni birisinin kötüye kullandığını düşünmeye yönlendirdi async void, ancak kaynaktaki hızlı aramalarım hiçbir şey bulamadı.

Ne yazık ki, 'async \ s [^ T]' gibi bir şey daha aradığımda 'Async \ svoid' (regex search) için arama yapıyordum (Görev tam olarak nitelendirilmediğini varsayarak ... puan alırsınız).

Daha sonra bulduğum async override void onActionExecuting(...bir baz denetleyicisiydi. Açıkçası bu sorun olmalı ve öyleydi. Bunu düzeltmek (bir an için senkronize hale getirmek) sorunu çözdü.

Soruya geri dön: Neden ah, arama kodu asla beklemediğinde neden geçersiz kılmayı async olarak işaretleyebilirsiniz?



Geçersiz kılmayı bekleyen bir arayanı tam olarak engelleyen nedir? Hiçbir engel görmüyorum.
Martin Maat

@MartinMaat Yalnızca geri dönen yöntemleri bekleyebilirsiniz Task.
Derek Elkins SE

Belki de fark etmediğim iyi bir nokta. Kontrol etmeliydim, ama beklemeden asenkron olmayan yöntemleri çağırmayla ilgili VS uyarısını hatırlamıyorum.
Peter T. LaComb Jr.

Yanıtlar:


16

Zaman uyumsuz anahtar kelime, yönteminawait tanımında sözdizimini kullanmasına izin verir . awaitHerhangi Taskbir async yöntemi olup olmadığına bakılmaksızın bir tür döndüren herhangi bir yöntem üzerinde yapabilirsiniz .

voidzaman uyumsuz bir yöntem için yasal ( cesareti kırılmış olsa da ) bir dönüş türü olduğundan, buna neden izin verilmiyor? Dışarıdan, asynconsuz yapamayacağınız hiçbir şeyi etkinleştirmezsiniz. Sorun yaşadığınız yöntem, zaman uyumsuz olmadan tam olarak aynı şekilde davranmak için yazılmış olabilir. Tanımı daha ayrıntılı olurdu.

Arayanlar için bir async Työntem olup döndürdüğü bir normal yöntemdir T(sınırlıdır void, Taskya da Task<A>). Bunun bir zaman uyumsuz yöntem olması arayüzün bir parçası değildir. Aşağıdaki kodun yasa dışı olduğuna dikkat edin:

interface IFoo {
    async void Bar();
}

It (veya soyut bir sınıftaki benzer bir kod) VS2012'de aşağıdaki hata iletisini üretir:

'Eşzamansız' değiştirici yalnızca ifade gövdesi olan yöntemlerde kullanılabilir

Ben ise yaptığı tipik asenkron olmak için bir arayüz veya ana sınıfında bir yöntem niyetinde, ben kullanamıyorum asyncbu iletişim kurmak için. Eğer awaitsözdizimi ile uygulamak isteseydim , async geçersiz kılma yöntemleri (üst sınıf durumda) olması gerekir.


1
Hiç bahsetmiyorsun override, ama sorunun konusu bu.
Nathan Tuggy

5
@NathanTuggy Cevabın asıl amacı async, bir yöntemin arayüzünü değiştirmemek, sadece tanımında sözdizimsel olarak izin verilen şeyi değiştirmektir, bu yüzden bir geçersiz kılma olup olmadığı tamamen önemsizdir.
Derek Elkins SE

1
Lütfen herkesin ilgili her şeyi bildiğini varsaymak yerine açıklayın .
Nathan Tuggy

2
@NathanTuggy Bunu açıkladığımı hissediyorum. Hangi konuda kafanız karıştığına dair belirli bir soru sorabilir misiniz, yoksa başka bir şaşkın kişinin soracağını mı hayal ediyorsunuz? Eklemeyi düşündüğüm tek şey, asyncdeğiştiricinin yalnızca uygulamalara uygulanabileceğine işaret etmektir. Örneğin, bir yöntemin zaman uyumsuz olup olmadığının arabirimin bir parçası olmadığının altını çizerek, bir arabirimde yöntem zaman uyumsuzluğu bildiremezsiniz.
Derek Elkins SE

5
Açıklamayı cevaba koyun, yani. Uzun vadede yorumların amacı bu değildir.
Nathan Tuggy

10

Zaman uyumsuz anahtar kelimenin tek amacı bu işlevin gövdesinde bir anahtar kelime beklemektir. Bekleme işlevinin eklenmesinin mevcut kodu bozmaması için bu gereklidir. Microsoft, bekleme tercihinden yararlanmaya karar verdi. Zaman uyumsuz olarak işaretlenmemiş bir işlev için await adında bir değişkeni sorunsuz tanımlayabilirsiniz.

Bu nedenle, zaman uyumsuz bir işlevin imzasının bir parçası değildir ve oluşturulan IL kodunda anlamsal bir anlamı yoktur. Derleyicinin işlevi doğru bir şekilde nasıl derleyeceğini bilmesi kesinlikle vardır. Derleyiciye yalnızca Görev, Görev <T> veya boşluğun döndürülmesini sağlama talimatını verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.