Неправильный асинхронный вызов службы WCF - PullRequest
0 голосов
/ 14 декабря 2011

Хорошо, у меня есть служба WCF, которая будет служить способом доступа к моей базе данных SQL. Эта часть в значительной степени не имеет отношения к этому вопросу, так как по какой-то причине мой сервис WCF падает. Или, по крайней мере, это вызывает сбой моего клиентского приложения Silverlight. Вот почему я прихожу сюда, чтобы спросить вас об этом, ребята.

Так вот код. Имейте в виду, что он вызывается асинхронно из моего клиента Silverlight. Когда это сделано, строка, возвращаемая этим методом, выводится на экран для клиента.

public string AddClients(IEnumerable<Client> newClients)
    {

        int nAdded = 0;
        int nelse = 0;
        string str = "";

        List<Client> newClientsList = newClients.ToList();
        List<Client> existingClients = dc.Clients.ToList();
        List<Client> clientsToAdd = new List<Client>();

        return newClientsList.Count.ToString();


        foreach (Client client in newClientsList)

        {
            var clt = existingClients.FirstOrDefault(c => c.ClientName == client.ClientName);

            if (clt == null)
            {

                return clt.ClientName;

                //str = str + " found:  " + clt.ClientName + "\n";
                //dc.Clients.(clt);

                //existingClients.Add(clt);
                //  clientsToAdd.Add(clt);

                nAdded++;
            }
            else
            {
                nelse++;
            }
        }

        if (nAdded > 0)
        {
            //str = str + "  more than one nAdded";
            //    dc.Clients.InsertAllOnSubmit(clientsToAdd);
           //    dc.SubmitChanges();
        }

        return nelse.ToString();

    }

Возможно, вам удастся выяснить, что должно происходить, но большая часть этого сейчас не происходит из-за того, что у меня это не очень хорошо получается.

В настоящий момент, как вы можете видеть, возвращение происходит довольно рано (до начала foreach). С вещами, как они есть, это работает хорошо. Вы нажимаете кнопку в клиенте, он делает звонок, а затем возвращается. Таким образом, вы получаете «3», возвращаемое в виде строки (это размер newClients, параметр). Это нормально, и по крайней мере доказывает, что служба может быть подключена, что она возвращает сообщения в порядке, а что нет.

Если я уберу этот самый верхний возврат, вот где он станет интересным (ну, проблемным). Он должен либо вернуть clt.ClientName в состоянии if (clt==null), либо вернуть nelse.ToString(), который находится в самом конце.

Что я на самом деле получаю? Ничего такого. Кажется, что метод завершения никогда не вызывается (окно сообщения, которое он показывает, никогда не появляется).

Я прокомментировал большую часть материала. Конечно, это должно попасть в одно из этих условий! Я пропустил что-то действительно очевидное здесь? Я действительно пытался отладить это целую вечность, но ничего! Может ли кто-то увидеть что-то очевидное, чего я не вижу?

Для записи 'dc' - это контекст данных, а dc.Clients - список клиентских сущностей.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я мог бы что-то упустить, но не бросит ли это NullReferenceException? Это должно быть как минимум частью вашей проблемы.

if (clt == null)
{
    return clt.ClientName;
    ...
0 голосов
/ 14 декабря 2011

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

Попробуйте:

public string AddClients(IEnumerable<Client> newClients)  
{
  string str = "";  
  List<Client> newClientsList = newClients.ToList();

  //to save processor and network
  List<string> existingClients = dc.Clients.Select(x => x.ClientName).ToList(); 

  List<Client> clientsToAdd = (from nc in newClientsList
                               join ec in existingClients on nc.ClientName equals ec into nec
                               from ec in nec.DefaultIfEmpty()
                               where ec == null
                               select nc).ToList();

  if (clientsToAdd.Count > 0)
  {
     dc.Clients.InsertAllOnSubmit(clientsToAdd);
     foreach (Client c in clientsToAdd)
        str += "found: " + c.ClientName + "\n";

     return str;
  }

  return "0 new clients found";
}  

проще, проще, чище.

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