行为不当的WCF服务异步调用

时间:2011-12-14 17:07:16

标签: wcf linq-to-sql

好的,我有一个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 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但这不会抛出NullReferenceException吗?这至少是你问题的一部分。

if (clt == null)
{
    return clt.ClientName;
    ...

答案 1 :(得分:0)

我不明白为什么你要从你收到的列表中返回第一个新发现的客户的名字。为什么不返回一个整数,其中包含您在数据库中插入的新找到的客户端的总数。

尝试:

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

更简单,更简单,更清洁。