2016-03-21 27 views
5

Używam biblioteki MvvmCross i AsyncEx w aplikacji Windows 10 (UWP).kod blokujący w asynchronicznej metodzie

W ViewModel, że mają właściwość INotifyTaskCompletion (1), który jest przewodowo do metody Async w (2)

w punkcie (2), to wywołać metodę biblioteki Async ViewModel których:

  • Sprawdza lokalnej pamięci podręcznej
  • pobrania dane asynchronicznie
  • Dodaje dane do pamięci podręcznej

Kod pamięci podręcznej nie może być wykonany asynchronicznie, dlatego metoda biblioteczna zawiera kod blokujący i kod asynchroniczny.

P. Jaki jest najlepszy sposób, aby zapobiec blokowaniu wątku interfejsu użytkownika?

Rozumiem, że od Stephen Cleary nie należy blokować kodu asynchronicznego i nie należy używać Task.Run w metodach bibliotecznych. Więc muszę ....

Przenoszenie wywołań buforowania do (2), np.

  • Zastosowanie Task.Run (w celu sprawdzenia cache)
  • wywołać metodę biblioteka asynchronicznie
  • Zastosowanie Task.Run ponownie (do buforowania danych)?

Czy istnieje lepszy sposób?

+1

Czy masz kod, którym mógłbyś się podzielić? –

+0

Zależy od twojej definicji "lepszego". Jeśli nie możesz zmienić kodu pamięci podręcznej i chcesz użyć async/await, to użycie 'Task.Run()' dla kodu buforującego jest "poprawne". – Jcl

Odpowiedz

3

Jeśli masz całkowicie synchroniczny kod, którego nie możesz zmienić, aby sprawić, że zwróci on oczekiwanie i chcesz uczynić go asynchronicznym, to tak, jedynym wyborem, jeśli chcesz użyć async/await, jest użycie Task.Run().

Coś jak:

public async Task<T> MyMethod() 
{ 
    T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange()); 
    if(result != null) 
    { 
    result = await MyLibraryMethodThatReturnsATask(); 
    await Task.Run(() => AddToCacheOnSyncMethodICantChange(result)); 
    } 
    return result; 
} 

powinien być OK.

+0

Dziękuję. Zaznaczę twoją odpowiedź jako poprawną. – Howard

+0

Pomimo mojej odpowiedzi i dla konkretnego przypadku pamięć podręczna powinna być szybka (to jest powód, dla którego go używasz) ... Czy na pewno chcesz, aby metody pamięci podręcznej były asynchroniczne? – Jcl

+1

Używam SQLite.net do buforowania danych w bazie danych opartej na plikach. Ponieważ ta praca nie jest związana z procesorem, chcę to zrobić bez blokowania wątku interfejsu użytkownika. Czy coś przeoczyłem? – Howard