2013-05-10 65 views
0

我创建了一个WCF服务,这是多次调用,Silverlight的一些问题,WCF

通话 此服务将做一个调用数据库的一个例子。可以在我的客户端说我有一个200值的列表。每个值都将匹配一个数据库条目。每个数据库条目都有10个值。现在我做的是以下。我选择了一些列表entrys,并在循环中调用WCF服务。

我有2个问题 第一:用户界面将挂起当时的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); 
     } 

    } 

我希望有人能帮助我休息出。如果有很多列表中的项目的

问候 马丁

回答

0

此调用

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

可能需要很长的时间。

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

public List<string> GetData(string[] sWert1, string[] sWert2) 
{ 
} 
+0

感谢您的帮助 – user2367263 2013-06-03 07:56:18