Silverlight 4 Async ждать как? - PullRequest
       2

Silverlight 4 Async ждать как?

1 голос
/ 29 августа 2011

У меня проблема:

//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.На этом этапе мой entryE_QuestMaster не имеет никакой записи, я просто хотел подождать, пока мой результат вернется, прежде чем цикл продолжится.

После ответа 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 Ответ

1 голос
/ 29 августа 2011

Вам необходимо переместить этот код:

       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);

Или, в качестве альтернативы, можно связать отображение вопросов с ObservableCollection, чтобы при его установке пользовательский интерфейс обновлялся автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...