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)的設備上運行的應用程序對此特別敏感。

相關問題