2013-07-31 16 views
5

Ho imparato a caricare pigro le proprietà nel mio repository. Ora mi piacerebbe farlo, ma ho anche bisogno di caricare qualcosa da una pagina web (usando Httpclient) che significa che la mia proprietà sarà asincrona.Proprietà di carico pigro con Async

public async Task<List<NewsModel>> News 
{ 
    get 
    { 
     if (_news == null) 
     { 
      CacheProvider cache = new CacheProvider(); 
      object cachedNews = cache.Get("news"); 

      if (cachedNews == null) 
      { 
       var client = new HttpClient(); 
       // await HttpResponse 
      } 

     } 
     return _news; 
    } 

    set 
    { 
     _news = value; 
    } 
} 

Tuttavia, visual studio mi sta dicendo che

"Async modificatore non è valido per questo articolo"

evidenziando la parola "News" nella prima linea.

È possibile farlo? O devo scrivere un metodo separato?

+0

lo prendo che hai l'istruzione using per System.Threading.Tasks? Inoltre, quale framework .NET è questo targeting? È Silverlight? - Non importa, ho appena visto che questa è una proprietà. Dovrai convertirlo in metodi. –

+0

Mi sembra che la proprietà 'News' abbia intuitivamente il tipo' Lista ', la decorazione' Task <> 'non sembra naturale qui. Perché ritieni di dover esporre la natura 'Task <>'? –

+0

@AndrewCoonce In realtà, se vuole scrivere un metodo async * *, dovrà sicuramente scriverlo come restituendo un compito. –

risposta

5

Prima di tutto, le proprietà con effetti collaterali di solito non sono poi così buone.

In questo caso, semplicemente , lettura, questa proprietà avvia una thread, un po 'di traffico di rete e qualche elaborazione su un server remoto.

Questo dovrebbe essere un metodo, non una proprietà.

In secondo luogo, il compilatore ha ragione, le proprietà non possono essere asincrone. Ora puoi sicuramente scrivere una proprietà che restituisce un'attività asincrona, ma non ti è permesso usare la parola chiave async. Fondamentalmente basta togliere la parola chiave async dalla dichiarazione di proprietà.

Ma il fatto che async non sia legale sulle proprietà è un altro indizio che è necessario scrivere un metodo, non una proprietà.

Nota Il async parola chiave non è effettivamente necessaria nel codice che hai postato, dal momento che non sta usando la parola chiave await in là. Pertanto, è sufficiente rimuovere completamente la parola chiave async, poiché non è richiesta. In effetti, se dovessi cambiare questo metodo con un metodo, il compilatore ti dirà che non è necessario dal momento che non stai usando await. (Rimosso dopo OP modificato la domanda)

+0

oh aspetta! Sto usando attendere! httpclient userà attendere come il ragazzo qui ha fatto: http://stackoverflow.com/questions/7929013/making-a-curl-call-in-c-sharp – Saturnix

+0

Se rimuovo il 'await' Devo avvolgere HttpResponseMessage in un'attività - il che significa che devo scrivere un 'wait' da qualche parte nel codice ... – Saturnix

+0

Beh, non puoi ancora scrivere puntelli erties usando 'async', così 'await' deve andare pure. –

1

Penso che this question sia correlato.

In breve: le proprietà asincrone non sono supportate.

1

È possibile utilizzare una proprietà pigro che restituisce un Task:

class MyClass 
{ 
    readonly Lazy<Task<string>> _text; 

    public MyClass() 
    { 
     _text = new Lazy<Task<string>>(async() => 
     { 
      //... await something 
      return "Hello!" 
     }); 
    } 

    async Task DoSomething() 
    { 
     var text = await _text.Value; 
     //... 
    } 
} 
Problemi correlati