Получить асинхронные данные из службы wcf - PullRequest
1 голос
/ 27 июня 2011

У меня есть wcf, который получает информацию из базы данных.

У меня также есть клиентское приложение Silverlight, которое ссылается на этот сервис и использует его для извлечения данных.

public void init(ref Cluster cluster)
{
    _SelectedCluster = cluster;
    MyEntities svc = new MyEntities(new    Uri("http://localhost:49672/MyDataService.svc/"));
        docs = new DataServiceCollection<EC_Documents>();
        var query = from c in svc.EC_Documents
                    where c.clusterID == _SelectedNode.ID
                    orderby c.clusterID
                    select c;

        docs.LoadCompleted += docs_LoadCompleted;      

    docs.LoadAsync(query);
}
    private void docs_LoadCompleted(object sender, LoadCompletedEventArgs e)
    {
        if (e.Error == null)
        {

            if (docs.Continuation != null)
            {
               docs.LoadNextPartialSetAsync();
            }
            else
            {
                _SelectedCluster.Value = docs.Count;

            }
        }
    }

Поскольку вызов асинхронный, мне пришлось сделать документы членом класса и проверить их количество в методе docs_LoadCompleted.

У меня также есть _SelectedCluster, который является объектом типа Cluster в качестве члена класса, который содержит текущий объект кластера в итерации.

У меня проблема с назначением результата выбранному в данный момент узлу _SelectedCluster.Value member.

Поскольку вызов асинхронный, я не могу выполнить итерацию по всем моим объектам кластера и назначить результат синхронно. Если я это сделаю, назначение всегда будет на последнем кластере в итерации.

Есть предложения?

1 Ответ

2 голосов
/ 27 июня 2011

Перестройте ваш код, чтобы получить выгоду от замыканий: -

public void init(Cluster cluster)
{
    MyEntities svc = new MyEntities(new    Uri("http://localhost:49672/MyDataService.svc/"));
        var docs = new DataServiceCollection<EC_Documents>();
        var query = from c in svc.EC_Documents
                    where c.clusterID == _SelectedNode.ID
                    orderby c.clusterID
                    select c;

        docs.LoadCompleted += (s, e) =>
        {
            if (e.Error == null)
            {
                if (docs.Continuation != null)
                {
                   docs.LoadNextPartialSetAsync();
                }
                else
                {
                    cluster.Value = docs.Count;
                }
            }
        };      

    docs.LoadAsync(query);
}

Теперь можно сделать несколько вызовов на init, используя каждый свой экземпляр DataServiceCollection<EC_Documents>.Я не уверен, что вы хотите сделать со значением _SelectedNode.ID, которое мне кажется неправильным, вы должны передать это значение в качестве параметра init.Конечно, если docs теперь локально, вам нужно будет решить, что делать с ним после загрузки всех документов для идентификатора кластера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...