如何在C#和MVVM中实现异步操作?

Osc*_*ero 9 c# wpf binding asynchronous mvvm

什么是在WPF和MVVM上实现异步操作的最简单方法,让我们说如果用户在某个字段上输入时我想要启动命令然后返回,而线程将执行一些搜索操作然后返回更新属性,以便通知可以更新绑定.

谢谢!

Dou*_*oug 8

Rob Eisenberg在他的MIX10演讲期间展示了在MVVM中运行异步操作的非常干净的实现.他在他的博客上发布了源代码.

基本思想是将命令实现为返回IEnumerable并使用yield关键字返回结果.这是他演讲中的一段代码,它将搜索作为后台任务:

    public IEnumerable<IResult> ExecuteSearch()
    {
        var search = new SearchGames
        {
            SearchText = SearchText
        }.AsResult();

        yield return Show.Busy();
        yield return search;

        var resultCount = search.Response.Count();

        if (resultCount == 0)
            SearchResults = _noResults.WithTitle(SearchText);
        else if (resultCount == 1 && search.Response.First().Title == SearchText)
        {
            var getGame = new GetGame
            {
                Id = search.Response.First().Id
            }.AsResult();

            yield return getGame;
            yield return Show.Screen<ExploreGameViewModel>()
                .Configured(x => x.WithGame(getGame.Response));
        }
        else SearchResults = _results.With(search.Response);

        yield return Show.NotBusy();
    }
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Gis*_*shu 3

一个BackgroundWorker实例在虚拟机上调用您的命令怎么样?

更新:取消上面的建议.. Jason Dolinger 有一个关于 MVVM 的在线视频.. 我建议你看一下。这是一种更干净的方式,其中视图很薄/不包含任何线程代码。

总结一下:

  • VM ctor 缓存 Dispatcher.CurrentDispatcher 对象(主线程)。
  • 更新后备存储(结果)时,使用 _dispatcher.BeginInvoke( () => _results.AddRange( entries) )以便正确更新 UI。

  • 最好链接到带有视频的页面:http://blog.lab49.com/archives/2650 (3认同)