0

我创建了一个被多次调用的 WCF 服务,

调用示例 此服务将对数据库进行调用。假设在我的客户中,我确实有一个包含 200 个值的列表。每个值都将匹配一个数据库条目。每个数据库条目确实有 10 个值。现在我要做的是以下。我选择了一些列表条目并循环调用 WCF 服务。

我有 2 个问题首先:UI 将在 WCF 调用时挂起第二:数据将逐步返回,我如何收集它们并在所有调用完成后将其发送回来?

请原谅我的任何错别字,我的英语不是最好的。

这是我的源代码

[ServiceContract(Namespace = "")]
[SilverlightFaultBehavior]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    [OperationContract]
    public List<string> GetData(string sWert1, string sWert2)
    {
        List<string> realtimanswer = new List<string>();
        string applicationPath = HostingEnvironment.MapPath("~/Configuration");
        cIniReader _ini = new cIniReader(applicationPath + @"\config.ini");
        string connectionString = _ini.ReadString("Database", "ConnectionString", "");
        OracleConnection connection = new OracleConnection();
        connection.ConnectionString = connectionString;
        try
        {
            connection.Open();
            OracleCommand cmd = connection.CreateCommand();
            cmd = new OracleCommand("GETDATA", connection);

            cmd.Parameters.Clear();
            OracleParameter param1 = new OracleParameter("PI_Wert1", OracleDbType.Varchar2);
            OracleParameter param2 = new OracleParameter("PI_Wert2", OracleDbType.Varchar2);
            OracleParameter param3 = new OracleParameter("PO_Wert3", OracleDbType.Int16);
            OracleParameter param4 = new OracleParameter("PO_Wert3", OracleDbType.Int16);
            OracleParameter param5 = new OracleParameter("PO_Wert4", OracleDbType.Int16);

            param1.Value = sWert1;
            param2.Value = sWert2;

            param1.Direction = System.Data.ParameterDirection.Input;
            param1.Size = 4096;
            param2.Direction = System.Data.ParameterDirection.Input;
            param2.Size = 4096;
            param3.Direction = System.Data.ParameterDirection.Output;
            param3.Size = 4096;
            param4.Direction = System.Data.ParameterDirection.Output;
            param4.Size = 4096;
            param5.Direction = System.Data.ParameterDirection.Output;
            param5.Size = 4096;

            cmd.Parameters.Add(param1);
            cmd.Parameters.Add(param2);
            cmd.Parameters.Add(param3);
            cmd.Parameters.Add(param4);
            cmd.Parameters.Add(param5);


            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            //cmd.CommandTimeout = 30;
            int test = cmd.ExecuteNonQuery();

            string returnCode = cmd.Parameters[17 - 1].Value.ToString();
            if (returnCode == "OK")
            {
                string sErg1 = cmd.Parameters[3 - 1].Value.ToString();
                realtimanswer.Add(sErg1);
                string sErg2 = cmd.Parameters[4 - 1].Value.ToString();
                realtimanswer.Add(sErg2);
                string sErg3 = cmd.Parameters[5 - 1].Value.ToString();
                realtimanswer.Add(sErg3);
                string sErg4 = cmd.Parameters[6 - 1].Value.ToString();
                realtimanswer.Add(sErg4);
                string sErg5 = cmd.Parameters[7 - 1].Value.ToString();
                realtimanswer.Add(sErg5);

            }
        }
        catch (Exception exp)
        {
            cDebugLog.Log("Error in Function: GetData " + exp.Message + " StackTrace: " + exp.StackTrace);
            connection.Close();
        }
        connection.Close();
        return realtimanswer;
    }
}

我用这个代码称之为

void Button1_Click(object sender, EventArgs e)
    {
        busyRealTimeViewPage.IsBusy = true;
        try
        {
            string url = Application.Current.Host.Source.AbsoluteUri;
            url = url.Replace("/ClientBin/ICWeb.xap", "/DBService.svc");
            var proxy_GetRealTime_DBService = new DBServiceReference.DBServiceClient();
            proxy_GetRealTime_DBService.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
            proxy_GetRealTime_DBService.GetDataCompleted += new EventHandler<DBServiceReference.GetDataCompletedEventArgs>(proxy_GetRealTime_DBService_GetDataCompleted);

            for (int i = 0; i < lstRealtime.Items.Count; i++)
            {
                if ((lstRealtim.ItemsSource as ObservableCollection<ListOfData>)[i].IsSelected == true)
                {
                    object[] w_toread = new object[5];
                    string sWrk = (lstMappedWorkgroups.ItemsSource as ObservableCollection<ListOfWorkgroups>)[i].Content;
                    w_toread[0] = sDat;
                    w_toread[1] = sDat + "_DE";
                    w_toread[2] = sDat + "_FR";

                    proxy_GetRealTime_DBService.GetDataAsync(w_toread[1].ToString(), "current", w_toread[1]);
                    proxy_GetRealTime_DBService.GetDataAsync(w_toread[2].ToString(), "current", w_toread[2]);
                }
            }
        }
        catch (Exception exp)
        {
            cDebugLog logger = new cDebugLog();
            logger.LogMessage("Error in Function: Button1_Click " + exp.Message + " StackTrace: " + exp.StackTrace);
        }

现在剩下的就在这里

   void proxy_GetRealTime_DBService_GetDataCompleted(object sender, DBServiceReference.GetMarqueeDataCompletedEventArgs e)
    {
        try
        {
            string help = e.UserState.ToString();
            string sWrktoView = cStringFunctions.Left(e.UserState.ToString(), help.Length - 3);

            // string sWrktoView = (lstMappedWorkgroups.ItemsSource as ObservableCollection<ListOfWorkgroups>)[i].Content;
            string sWrktoViewDE = sWrktoView + "_DE";
            string sWrktoViewFR = sWrktoView + "_FR";

            if ((sWrktoViewDE == e.UserState.ToString()) || (sWrktoViewFR == e.UserState.ToString()))
            {
                if (!(toView.Any(wrk => wrk.Workgroup == sWrktoView)))
                {
                    if (sWrktoViewDE == e.UserState.ToString())
                    {
                        toView.Add(new RealtTime(sWrktoView, sWrktoViewDE, e.Result[0], e.Result[1], e.Result[2], e.Result[3], e.Result[4], e.Result[5], e.Result[6], e.Result[7], e.Result[8], e.Result[9], e.Result[10], e.Result[11], e.Result[12], e.Result[13], sWrktoViewFR, "", "", "", "", "", "", "", "", "", "", "", "", "", ""));
                    }
                    if (sWrktoViewFR == e.UserState.ToString())
                    {
                        toView.Add(new RealtTime(sWrktoView, sWrktoViewDE, "", "", "", "", "", "", "", "", "", "", "", "", "", "", sWrktoViewFR, e.Result[0], e.Result[1], e.Result[2], e.Result[3], e.Result[4], e.Result[5], e.Result[6], e.Result[7], e.Result[8], e.Result[9], e.Result[10], e.Result[11], e.Result[12], e.Result[13]));
                    }
                }
            }


            if (sWrktoViewFR == e.UserState.ToString())
            {
                var wrkFR = toView.FirstOrDefault(x => x.WorkgroupFR == sWrktoViewFR);
                if (wrkFR != null)
                {
                    wrkFR.WorkgroupFR = sWrktoViewFR;
                    wrkFR.erg1FR = e.Result[0];
                    wrkFR.erg2FR = e.Result[1];
                    wrkFR.erg3FR = e.Result[2];
                    wrkFR.erg4FR = e.Result[3];
                    wrkFR.erg5FR = e.Result[4];
                    // fill with other data
                }
            }

            if (sWrktoViewDE == e.UserState.ToString())
            {
                var wrkDE = toView.FirstOrDefault(x => x.WorkgroupDE == sWrktoViewDE);
                if (wrkDE != null)
                {
                    wrkDE.WorkgroupDE = sWrktoViewDE;
                    wrkDE.erg1DE = e.Result[0];
                    wrkDE.erg2DE = e.Result[1];
                    wrkDE.erg3DE = e.Result[2];
                    wrkDE.erg4DE = e.Result[3];
                    wrkDE.erg5DE = e.Result[4];
                    // fill with other Data

                }

            }

            dgridRealTimeView.ItemsSource = null;             
            dgridRealTimeView.ItemsSource = toView;
            busyRealTimeViewPage.IsBusy = false;
        }
        catch (Exception exp)
        {
            cDebugLog logger = new cDebugLog();
            logger.LogMessage("Methode: proxy_GetRealTime_DBService_GetDataCompleted: " + exp.Message + " StackTrace: " + exp.StackTrace);
        }

    }

我希望有人可以帮助我。

问候马丁

4

1 回答 1

0

这个电话

for (int i = 0; i < lstRealtime.Items.Count; i++)

如果列表中有很多项目,可能需要很长时间。

您应该考虑在 WCF 服务上创建一个新方法来执行所有操作,然后返回结果。

public List<string> GetData(string[] sWert1, string[] sWert2)
{
}
于 2013-05-12T07:16:12.677 回答