2015-07-31 21 views
5

Bazen aramaları beklemeyi ve bazen yapamayan sanal bir yöntem var. IDE bana uyarı veriyor, bunun için uygun yol nedir? Benim taban sınıftaAsync/Await beklemeden arayın

: o beklemektedir yoluyla denilen olsun temel sınıf Dan

protected virtual async Task GoNext() 

.

Daha sonra alt sınıflarımda bu yöntemi geçersiz kıldım, ancak beklemede olduğu zamanlar ve içermediği zamanlar var.

+5

Soruyu anlamıyorum. "async", devralınan yöntem imzasının bir parçası değildir. "Beklemeyi" kullanmayan geçersiz kılınan bir yöntemi bildirirken "async" yazmayın. Yine de bir 'Görev' veya 'Görev ' döndürmeniz gerekecek. Sorunu ve gerçek uyarıyı gösteren bazı kodlar yayınlamalısınız, böylece yaşadığınız asıl sorun hakkında hiçbir karışıklık olmamalıdır. –

+0

Yöntem bekletme anahtar sözcüğünü kullanmıyorsa async anahtar sözcüğünü katılamıyor musunuz? – Stefan

+1

bulduklarınızın bazı örnekleri, daha iyi bir soru yapmalıdır. –

cevap

8

async anahtar sözcüğü aslında, devralınan yöntem imzasının bir parçası değildir, ancak derleyiciye, async yöntemlerinin modeline göre yöntemi derlemek ve yeniden yazmak için gereken bir sinyaldir.

Bu şekilde, miras alınan yöntem await anahtar sözcüğünü kullanmıyorsa, devralınan yöntemlerde async anahtar sözcüğünü dışarıda bırakabilirsiniz. Hala geri dönmek zorunda kalacak

Note Task veya Task<T>, o kısım kalıtsal yöntem imzasının parçasıdır.

Uyarı:

class Base 
{ 
    public virtual async Task<int> Method() 
    { 
     await Task.Delay(10); 
     return 42; 
    } 
} 

class Derived : Base 
{ 
    // next line produces warning 
    public override async Task<int> Method() 
    { 
     return 42; 
    } 
} 

uyarı şudur:

Yani bu size bir uyarı verecektir Bu zaman uyumsuz yöntem yoksun CS1998 operatörleri 'bekliyor' ve eşzamanlı çalışacaktır. Bloke edilmeyen API çağrılarını beklemek için await operatörünü kullanmayı veya arka plan iş parçacığına CPU bağlı çalışmayı yapmak için await Task.Run(...) kullanmayı düşünün. async kelime getirdiği "sihirli" bir kısmı otomatik tamamlamayı çünkü bu son yöntemde return ifadeyi değiştirdi

class Derived : Base 
{ 
    public override Task<int> Method() 
    { 
     return Task.FromResult(42); 
    } 
} 

Not:

Ancak bu, bir uyarı üretmek olmaz Task<T> içinde dönüş değeri. Task<T>'u elde etmenin başka yollarına sahipseniz, açıkçası yukarıdaki gibi yaptığım gibi bir sonuç almanıza gerek yoktur.