2012-09-13 14 views
22

C#/XAML'deki bir windows 8 uygulamasında bazen eşzamansız bir yöntemden beklenmeyen bir yöntem aramak istiyorum. bundanEşzamansız bir yöntemde beklemede bir yöntem aramak mümkün mü?

public async Task<string> MyCallingMethod() 
    { 
     string result = await myMethodAsync(); 
     return result; 
    } 

:

Aslında bu yerine doğru

public string MyCallingMethod() 
    { 
     Task.Run(async() => { 
      string result = await myMethodAsync(); 
      return result; 
      }); 
    } 

avantajı benim için ben bekliyor olmadan MyCallingMethod kullanabilirsiniz ama bu doğru olmasıdır? MyCallingMethod için bir ref parametresini geçmek istiyorum, çünkü bir async yönteminde ref parametrelerinin olması mümkün değildir. o Eğer iplik engeller anlamına gelecektir çünkü

+0

çalışmayacak. anonim async işleviniz, değeri dış işleve döndürmez. – Denis

cevap

15

Gerçekten, sen UI iş parçacığı üzerinde iseniz böyle bir şey yapmaya olmamalıdır. Bunun yerine, ref parametresini, örneğin değiştirmek istediğiniz değeri içeren basit bir sınıf türünde bir parametre kabul ederek çalışmalısınız.

Bunu yapmamanın bir başka nedeni de, ref parametrelerini kullanmanıza izin vermeyeceğidir, çünkü lambdas, kapama yönteminin ref parametrelerine erişemez.

Ama bunu gerçekten yapmak istiyorsanız (tekrar, gerçekten yapmamalısınız diye düşünüyorum), o zaman Task sonucunu almanız gerekecektir. Bir şey gibi: zaman uyumsuz olmayan yöntemde

public string MyCallingMethod() 
{ 
    var task = Task.Run(async() => 
    { 
     return await myMethodAsync(); 
    }); 
    return task.Result; 
} 
+0

Güzel, kendi kendini çözen bir görev ve sonucu döndür. Teşekkürler – DRapp

40

ya uyumsuz Görevi başlatmak ve sonuç için sabırsızlanıyorum:

public void MyCallingMethod() 
{ 
    Task t = myMethodAsync(); 
} 

veya bittikten sonra denir ContinueWith olay işleyicisi, ekleyebilir

: zaman uyumlu Görev sonucunu alabilirsiniz

public void MyCallingMethod() 
{ 
    myMethodAsync().ContinueWith(
     result => 
     { 
      // do stuff with the result 
     }); 
} 

veya Görev, 210

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
}