проблема в silverlight 4 async как дождаться результата - PullRequest
0 голосов
/ 29 августа 2011

Вот что у меня есть проблема

У меня есть следующий код:

  //Get All master record
        entryE_QuestMaster = new ObservableCollection<E_QuestMaster>();
        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);
        }

вот асинхронный метод вызова службы wcf

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

проблема: при запуске системы -> QuestVM.getExamsMasterbyExamID (eUtility.ConvertInt32 (this.txtID.Text), ref entryE_QuestMaster);

он не ждет, пока я получу e.result, просто перейдите к следующей строке кода, которая цикл foreach.

plssss, помогите кому-нибудь или дайте идею с примером кода, что я должен сделать, чтобы дождаться e.result

Я хотел кое-как подождать, пока я получу e.result

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011

Добавьте действие в метод getExamsMasterbyExamID, затем выполните обратный вызов после завершения.

public void getExamsMasterbyExamID(int ID, ref ObservableCollection<E_QuestMaster> iCollectionData,Action<object> callback)
{
    ObservableCollection<E_QuestMaster> iCollectionDataResult = iCollectionData;
    eLearningDataServiceClient client = new eLearningDataServiceClient();
    client.getExamsMasterCompleted+=(s,e)=>
        {
            iCollectionDataResult = e.Result;
            //the callback will be executed on the calling method
            callback(e.Result);
        };
    client.getExamsMasterAsync(ID);
}

Теперь, когда вы вызываете метод Async, добавьте цикл внутри обратного вызова, как показано ниже:

    entryE_QuestMaster = new ObservableCollection<E_QuestMaster>();
    QuestVM.getExamsMasterbyExamID(eUtility.ConvertInt32(this.txtID.Text), ref entryE_QuestMaster,r=>
    {
        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);
      }    
   });

через 2 месяца, вероятно, это не будет полезно для спрашивающего, но, возможно, для кого-то еще ...

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

одно простое решение. Переместите код, который вы хотите выполнить после получения e.result в этом цикле.

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

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