【问题标题】:What's the right pattern for creating asyncronous services?创建异步服务的正确模式是什么?
【发布时间】:2010-10-21 00:05:08
【问题描述】:

这就是我想要做的:

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

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

【问题讨论】:

    标签: .net multithreading silverlight asynchronous windows-phone-7


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2011-08-04
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多