none
使用的API都是基于Async的,导致获取数据的线程还没执行完,主线程就绑定数据了,之后才执行获取数据的线程。如何解决呢,已提供关键代码。谢谢。 RRS feed

  • 问题

  • 前提条件:采用MVVM框架,采用分层,数据库采用SQLite,数据访问层使用SQLite.NET的一个类库实现,里面的API都是Async形式的。

    要实现的界面:

    代码结构:

    --------------------------------------------------------------------

    关键代码:

    Service/DeptService.cs:

    class DeptService
        {
            SQLiteAsyncConnection conn;
    
            public DeptService()
            {
                conn = DBSchema.SQLITE_CONN;
            }
    
            public async Task<ObservableCollection<Dept>> GetData()
            {
                ObservableCollection<Dept>  list = new ObservableCollection<Dept>();
    
                var query = conn.Table<Dept>();
                
                var result = await query.ToListAsync();//运行到这儿直接返回给调用者继续执行,因此数据一直没取出来(query.ToListAsync()方法是封装SQLite操作的API,只提供了异步操作的方法);等其他线程执行完后会返回到这继续执行。如何解决这个问题呢?否则终止最后读取数据,用户之前在界面一直是没有数据的。
                foreach (var item in result)
                {
                    list.Add(item);
                }
    
                return list;
            }
        }

    ViewModel/EmployeeViewMode.cs:

    class EmployeeViewModel : INotifyPropertyChanged
        {
            EmployeeService service = new EmployeeService();
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public MyCommand<object> GetCommand { get; set; }
    
            public ObservableCollection<Employee> Employees { get; set; }
    
            public ObservableCollection<Dept> DeptList {get; set;}
    
            public EmployeeViewModel()
            {
                GetCommand = new MyCommand<object>(GetEmployees);
    
                DeptList = new ObservableCollection<Dept>();
    
                FillDeptList();
    
                Debug.WriteLine("aaa");
            }
            //这里数据没取出来就返回了
            async void FillDeptList()
            { 
                DeptService deptService = new DeptService();
                Task < ObservableCollection < Dept >> getDeptList = deptService.GetData();
                DeptList = await getDeptList;
            }
    
    
            void GetEmployees(object obj)
            {
                if (Employees == null) Employees = new ObservableCollection<Employee>();
                Employees.Clear();
                service.GetData();
                Employees = service.EmpList;
    
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Employees"));
    
                Debug.WriteLine("Refresh called!");
            }
    
            private Employee _ctc = new Employee();
            public Employee CurrentEmployee
            {
                get { return _ctc; }
                set
                {
                    _ctc = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("CurrentEmployee"));
                }
            }
        }

    2012年8月23日 10:21

答案

  • Hi,

    Task < ObservableCollection < Dept >> getDeptList = deptService.GetData();

    你可以试试把上面这句话改成:

    ObservableCollection < Dept > getDeptList = await deptService.GetData();

    数据绑定的话如果实现了INotifyPropertyChanged接口,那么数据先于绑定或者后于绑定是无所谓的。都可以显示出来,你的这个问题我想应该是异步过程并没有取到数据,因此显示不出。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2012年8月27日 6:10
    版主

全部回复

  • listView1.ItemsSource = await query.ToListAsync();

    直接这样设置应该可行,还有其它可行的方法吗?

    2012年8月25日 8:28
  • Hi,

    Task < ObservableCollection < Dept >> getDeptList = deptService.GetData();

    你可以试试把上面这句话改成:

    ObservableCollection < Dept > getDeptList = await deptService.GetData();

    数据绑定的话如果实现了INotifyPropertyChanged接口,那么数据先于绑定或者后于绑定是无所谓的。都可以显示出来,你的这个问题我想应该是异步过程并没有取到数据,因此显示不出。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2012年8月27日 6:10
    版主