MVVM a async rubrika: Programování: Jiné

7 xxar3s
položil/-a 24.2.2013

Ako vo ViewModeli pracovat s async a await ? predtym (ked som nepouzival MVVM) som v codebehinde nacital polozky do ItemSource az ked sa downloadli:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        LoadUsers();
    }
 
    private async void LoadUsers()
    {
        var userRepository = new UserRepository("http://adresa-servera.com/");
        userRepository.DownloadProgress = eventArgs => Dispatcher.Invoke(() => progressBar.Value = eventArgs.ProgressPercentage);
        usersListBox.ItemsSource = await userRepository.AsyncGetAllUsers();
    }
}

Teraz si View pri bindingu pyta polozky priamo z ViewModelu a tam nemam kde obsluzit asynchronnu operaciu. Jedine ze by som ju spustil na aplikacnom threade to by potom, ale cela aplikacia "zamrzla" az kym by sa nedokoncila operacia a tak to nechcem.

Komentáře

  • Honza Břešťan : Nestaci wrapnout tu metodu v property getteru nebo jine metody a volat s await uvnitr? To ji porad vykona asynchronne, ale na GUI threadu bude non-blocking wait, takze se GUI pro uzivatele nezasekne. Nejsem si ale 100% jisty, s WPF jsem v .NETu 4.5 nedelal. 24.2.2013
  • xxar3s : Vdaka za radu, ale vlastne som na to isiel zle, predtym som z property data len cital. Teraz som jej nastavil aj moznost zapisu. Vo ViewModeli som tu asynchronnu operaciu spustil tak aby neblokovala vlakno, po dokonceni asynchronnej operacie sa data zapisuju priamo do property pricom sa zavola PropertyChanged, takze sa zmena automaticky prenesie aj do view. 24.2.2013
odkaz
5 jiravanet
odpověděl/-a 26.2.2013

View by si při bindingu už mělo jen získaná data převzít a zobrazit. Z toho co píšeš to vypadá, že v property vykonáváš nějakou další činnost, což není dobře. Ta činnost by se měla udát na základě nějakého Commandu nebo Eventu, ten potom naplní property a zavolá NotifyPropertyChanged. To celé pak může samozřejmě celé běžet s využitím async await, nebo můžeš využít jiných způsobů - coroutines, ReactiveUI, backgroundworker atd.

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.