从silverlight调用WCF服务时出现长时间延迟

时间:2009-08-24 08:31:11

标签: wcf silverlight

我有一个silverlight 3应用程序,它通过WCF从ms-sql-server 2008获取一些简单数据。首先,它获取存储在数据库中的所有id(~2000),然后从另一个表中获取这些id的所有细节(平均每个id约10条记录)。

我的问题是,从调用细节到实际获得结果需要很长时间(~13-18秒)。在获取第一个详细信息项之后,其余的快速进入。

我应该在哪里寻找瓶颈?

这是我使用的代码。首先,我的两个WCF方法

这个得到了ids

    public HashSet<int> GetAllIds()
    {
        HashSet<int> resultSet = new HashSet<int>();
        SqlConnection connection = new SqlConnection(sqlConnectionString);
        connection.Open();

        try
        {
            SqlCommand command = new SqlCommand("SELECT id FROM stammDaten", connection);

            using (IDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    resultSet.Add(reader.GetInt32(0));
                }
                reader.Close();
            }
        }
        catch (Exception e)
        {
            Logger.instance.ErrorRoutine(e, "");
        }

        connection.Close();

        return resultSet;
    }

这个获取单个ID的详细信息:

    public List<GeoKoordinates> GetGeoKoordinatesById(int stammDatenId)
    {
        List<GeoKoordinates> resultSet = new List<GeoKoordinates>();
        SqlConnection connection = new SqlConnection(sqlConnectionString);
        connection.Open();

        try
        {
            SqlCommand command = new SqlCommand("SELECT stammDatenId, position, latitude, longitude FROM geoKoordinates WHERE stammDatenId=@stammDatenId ORDER BY stammDatenId, position", connection);
            command.Parameters.Add(new SqlParameter("@stammDatenId", SqlDbType.Int));
            command.Parameters["@stammDatenId"].Value = stammDatenId;

            using (IDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    GeoKoordinates geoKoors = new GeoKoordinates();
                    geoKoors.stammDatenId = reader.GetInt32(0);
                    geoKoors.position = reader.GetInt32(1);
                    geoKoors.latitude = reader.GetDouble(2);
                    geoKoors.longitude = reader.GetDouble(3);

                    resultSet.Add(geoKoors);
                }
                reader.Close();
            }
        }
        catch (Exception e)
        {
            Logger.instance.ErrorRoutine(e, "");
        }

        connection.Close();

        return resultSet;
    }

以下是我的silverlight-app的功能,它们使用这些方法。 _s1是我的WCF应用程序的ServiceReference实例

private void InitMap()
{
            ...
        _s1.GetAllIdsCompleted += new System.EventHandler<OSMDeepEarthExample.ServiceReference1.GetAllIdsCompletedEventArgs>(s1_GetAllIdsCompleted);
    _s1.GetGeoKoordinatesByIdCompleted += new System.EventHandler<GetGeoKoordinatesByIdCompletedEventArgs>(s1_GetGeoKoordinatesByIdCompleted);
    _startTime = DateTime.Now;
    _s1.GetAllIdsAsync();
    }

当wcf-service返回ids

时,会调用此方法
    void s1_GetAllIdsCompleted(object sender, OSMDeepEarthExample.ServiceReference1.GetAllIdsCompletedEventArgs e)
{
    TextBlockTest.Text += (DateTime.Now - _startTime).Seconds.ToString();

    foreach (int id in e.Result)
    {
        _s1.GetGeoKoordinatesByIdAsync(id);
    }
}

最后,处理返回的详细设置的那个。

    void s1_GetGeoKoordinatesByIdCompleted(object sender, GetGeoKoordinatesByIdCompletedEventArgs e)
{
    TextBlockTest.Text += (DateTime.Now - _startTime).Seconds.ToString();

    if (e.Result.Count > 0)
    {
        Polygon thePoly = new Polygon();
        _myLayer.Add(thePoly);

        ObservableCollection<Point> myPoints = new ObservableCollection<Point>();

        foreach (GeoKoordinates ko in e.Result)
        {
            Point point = new Point(ko.longitude, ko.latitude);

            if (!myPoints.Contains(point))
                myPoints.Add(point);
        }

        thePoly.Points = myPoints;
                    ... more polygone formatting ...

    }

提前致谢, 弗兰克

1 个答案:

答案 0 :(得分:1)

所以这就是你正在做的事情:

Call WCF
Open db connection
get 2000 records
close connection

for 1 to 2000
    Call WCF
    open db connection
    get 10 records
    close connection
next

在2001年调用WCF并打开和关闭数据库连接2001次时,20秒似乎非常快。

尝试这样:

Call WCF once
Open db connection
get 2000 records
for 1 to 2000
    get 10 records
next
close db connection

return a List<GeoKoordinates> 

1个WCF调用和1个数据库连接应该快得多