2011-08-28 40 views
1

我有一个问题:Silverlight 4异步等待如何?

//Get All master record 
entryE_QuestMaster = new ObservableCollection<E_QuestMaster>(); 

//Here I am calling my web service to get data 
QuestVM.getExamsMasterbyExamID(eUtility.ConvertInt32(this.txtID.Text), ref entryE_QuestMaster); 

//Loop to show questions 
int iNumber=1; 
foreach (var oIn in entryE_QuestMaster) 
    { 
     Node subNode = new Node(); 
     subNode.Content = oIn.e_Question; 
     subNode.Name = "Quest_" + iNumber.ToString().Trim(); 
     subNode.Tag = oIn.e_QID.ToString(); 
     subNode.Icon = "/Images/Number/" + iNumber.ToString().Trim() + ".gif"; 
     iNumber++; 
     this.tvMainNode.Nodes.Add(subNode); 
    } 

每当我打电话

QuestVM.getExamsMasterbyExamID(eUtility.ConvertInt32(this.txtID.Text), ref entryE_QuestMaster); 

它运行下面的代码

public void getExamsMasterbyExamID(int ID, ref ObservableCollection<E_QuestMaster> iCollectionData) 
     { 
      ObservableCollection<E_QuestMaster> iCollectionDataResult = iCollectionData; 
      eLearningDataServiceClient client = new eLearningDataServiceClient(); 
      isSync = true; 
      client.getExamsMasterCompleted+=(s,e)=> 
       { 
        iCollectionDataResult = e.Result; 
       }; 
      client.getExamsMasterAsync(ID); 

     } 

我的问题是我想等到我的e.result回来在iCollectionDataResult

当前在调用该服务后,系统继续执行foreach循环中的下一行代码。在这个阶段,我的入门E_QuestMaster没有任何记录,我只是想等到我的结果在循环继续之前回来。

回答ChrisF

没有dought后说的话chrisf要为我工作,但我想要做的每一件事在我的MVVM类而不是在形式层面,在这里我有什么在我的代码的变化,我仍然需要你的帮助,并且要做一些专业的代码,而不是仅仅编写庞大的代码。

我在MVVM类将这两行

 public delegate void ShowQuestionTreeView(ObservableCollection<sp_GetQuestMasterbyExamID_Result> iResultQuestMaster); 
    public event ShowQuestionTreeView ShowQuestionforTreeview; 

然后在方法我已经加入此

/// <summary> 
    /// 
    /// </summary> 
    /// <param name="ID"></param> 
    public void getExamsMasterbyExamID(int ID, ref ObservableCollection<sp_GetQuestMasterbyExamID_Result> iCollectionData) 
    { 
     ObservableCollection<sp_GetQuestMasterbyExamID_Result> iCollectionDataResult = iCollectionData; 
     eLearningDataServiceClient client = new eLearningDataServiceClient(); 
     client.getExamsMasterbyExamIDCompleted+= (s, e) => 
      { 
       iCollectionDataResult = e.Result; 
       **ShowQuestionforTreeview(iCollectionDataResult);** 
      }; 
     client.getExamsMasterbyExamIDAsync(ID); 
    } 

在客户端我已经做到了这一点

  //Generate Treeview for question 
     QuestVM.ShowQuestionforTreeview += new eQuestCreateVM.ShowQuestionTreeView(QuestVM_ShowQuestionforTreeview); 

方法:

void QuestVM_ShowQuestionforTreeview(ObservableCollection<sp_GetQuestMasterbyExamID_Result> iResultQuestMaster) 
    { 
     //Loop to show questions 
     int iNumber = 1; 
     foreach (var oIn in iResultQuestMaster) 
     { 
      Node subNode = new Node(); 
      subNode.Content = oIn.e_Question; 
      subNode.Name = "Quest_" + iNumber.ToString().Trim(); 
      subNode.Tag = oIn.e_QID.ToString(); 
      subNode.Icon = "/Images/Number/" + iNumber.ToString().Trim() + ".gif"; 
      subNode.Title = oIn.e_Question_Text; 
      iNumber++; 
      tvCreateQuestion.Nodes[0].Nodes.Add(subNode);    
     } 
    } 

回答

1

您需要将这些代码:

 client.getExamsMasterCompleted+=(s,e)=> 
      { 
       iCollectionDataResult = e.Result; 
      }; 

您的通话外getExamsMasterbyExamID。这也意味着你在申报并初始化eLearningDataServicesClient的地方。

您现在设置了代码的方式意味着您假定在方法返回时将设置iCollectionDataResult。然而,这种情况并非如此。该方法将在触发getExamsMasterCompleted事件之前返回。

您将需要遵循以下方针组织代码:

eLearningDataServiceClient client = new eLearningDataServiceClient(); 
client.getExamsMasterCompleted += (s,e) => 
{ 
    //Loop to show questions 
} 

client.getExamsMasterAsync(ID); 

或可选择地结合的问题,所以当它被设定自动更新UI的的ObservableCollection显示。

+0

嗨ChrisF:你能看到我做过的改变吗? – AQEEL

+1

@Aqeel:请不要大喊。 – AnthonyWJones

+0

@AQEEL:不要使用上限的先例 – pal4life