代码之家  ›  专栏  ›  技术社区  ›  Micah

创建异步服务的正确模式是什么?

  •  2
  • Micah  · 技术社区  · 14 年前

    我要做的是:

    public class EmployeeService
    {
        public void GetEmployeesAsyc(Action<IEnumerable<Employees>> callback)
        {
            ThreadPool.QueueUserWorkItem(x => {
                 var employees = //...fetch employees ...//
                 callback(employees);
            });
        }
    }
    
    public class ViewModel
    {
        private EmployeeService _employeeService;
        private bool _isLoaded;
    
        public ViewModel() 
        { 
             _employeeService = new EmployeeService();   
             EmployeeList = new ObservableCollection<Employee>();
        }
    
        public ObservableCollection<Employee> EmployeeList { get; set; }
    
        public void LoadData()
        {
             if(_isLoaded) return;
    
             _employeeService.GetEmployeesAsync(employees => 
             {
                 EmployeeList.Clear();
                 employees.ForEach(employee => EmployeeList.Add(employee));          
             });
    
             _isLoaded = true;
        }
    }
    
    public partial class View : PhoneApplicationPage
    {
         private ViewModel _vm;
    
         public View()
         {
             InitializeComponent();
             _vm = new ViewModel();
             this.Loaded += (sender, e) => _vm.LoadData();
         }
    }
    

    这里的问题是,这会引发一个跨线程异常:

             _employeeService.GetEmployeesAsync(employees => 
             {
                 EmployeeList.Clear();
                 employees.ForEach(employee => EmployeeList.Add(employee));          
             });
    

             _employeeService.GetEmployeesAsync(employees => 
             {
                 Dispatcher.BeginInvoke(() =>
                 {
                     EmployeeList.Clear();
                     employees.ForEach(employee => EmployeeList.Add(employee));          
                 });
             });
    

    但我不确定这样做是否正确。有什么建议吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Mick N    14 年前

    使用dispatcher将UI更改从后台线程转到UI线程没有问题。这是它的主要目的之一。