刷新DataServiceCollection

时间:2013-11-20 10:57:08

标签: c# wpf wcf-data-services async-await

我想知道是否有一个代码刷新了我的DataServiceCollection,它使用BeginExecute async等待任务加载到WPF客户端中,如下所示:

public static async Task<IEnumerable<TResult>> ExecuteAsync<TResult>(this DataServiceQuery<TResult> query)
{
    //Thread.Sleep(10000);
    var queryTask = Task.Factory.FromAsync<IEnumerable<TResult>>(query.BeginExecute(null, null), (asResult) =>
    {
        var result = query.EndExecute(asResult).ToList();
        return result;
    });
    return await queryTask;
}

我将扩展方法称为以下内容:

public async void LoadData()
{
   _ctx = new TheContext(the URI);
   _dataSource = new DataServiceCollection<TheEntity>(_ctx);
   var query = _ctx.TheEntity;
   var data = await Task.Run(async () => await query.ExecuteAsync());
   _dataSource.Clear(true);
   _dataSource.Load(data);
}
  1. 在ViewModel中调用LoadData
  2. 使用SQL Management Studio手动更改字段值
  3. 再次调用LoadData &lt;&lt;&lt;&lt;不刷新!!!
  4. 同时,如果我使用Load方法,数据刷新时没有任何问题:

    var query = _ctx.TheEntity;
    _dataSource.Load(query);
    

    另一个问题是我不知道如何取消客户端更改。最后一个问题是MergeOption是否对BeginExecute..EndExecute有任何影响,或者它只适用于Load方法?

1 个答案:

答案 0 :(得分:0)

我怀疑数据上下文不喜欢从多个线程访问。

我建议您先从扩展方法中删除所有处理:

public static Task<IEnumerable<TResult>> ExecuteAsync<TResult>(this DataServiceQuery<TResult> query)
{
  return Task.Factory.FromAsync(query.BeginExecute, query.EndExecute, null);
}

你应该使用而不用跳转到后台线程:

public async Task LoadDataAsync()
{
  _ctx = new TheContext(the URI);
  _dataSource = new DataServiceCollection<TheEntity>(_ctx);
  var query = _ctx.TheEntity;
  var data = await query.ExecuteAsync();
  _dataSource.Clear(true);
  _dataSource.Load(data);
}