2

这里就是我想要做的事:什么是创建异步服务的正确模式?

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));   
      }); 
     }); 

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

回答

3

使用调度程序将您的UI更改从后台线程转移到UI线程上没有任何问题。这是它的主要目的之一。

一些框架元素为您提供了内置的功能(例如webclient vs httpwebrequest)以节省编写调度程序代码的麻烦,但如果您执行大量工作,则会导致UI性能下降,因为你有更多的代码,你需要在UI线程上执行。在具有受限资源(例如WP7)的设备上运行的应用程序对此特别敏感。

相关问题