簡體   English   中英

C#中的委托或回調方法以等待函數完成

[英]Delegate or Callback method in C# to wait for a Function to Finish

所以這是背景,由於實際代碼很長,我將發布一些我想做的偽代碼。 因此,在我們的移動應用程序中,我們有一個身份驗證服務器,當每個用戶登錄到該應用程序時,該服務器都會為他們生成一個sessionID。 當他們使用應用程序時,需要根據身份驗證服務器來驗證sessionID,因此,如果用戶空閑時間太長,他們將需要重新登錄並獲取新的sessionID。 因此,我需要做的是,在調用另一種Web服務方法之前,我需要檢查用戶是否具有現有的sessionID,以及該sessionID是否仍然有效(這部分我已經可以完成)。 到目前為止,一旦我在對服務的第一個異步調用之后進入會話驗證方法,由於該會話仍在被驗證或正在生成新的sessionID,另一種方法正在繼續引起問題。 以下是我對VerifySession方法所擁有的(大量偽代碼來了解發生了什么,因為實際代碼很長)

public MobileServiceSoapClient CheckSession()
        {
            AuthenticationService amProxy = new AuthenticationService();
            MobileServiceSoapClient serviceClient = new MobileServiceSoapClient();
            //first check if there's an existing session UUID and if that session is still valid
            AMUserSessionRequest sessionRequest = new AMUserSessionRequest();
            String sessionID = HelperMethods.GetStringForKey(Constants.keySessionID);
            if (sessionID.Length <= 0)
            {
                Debug.WriteLine("Generating new session ID");
                //no existing session available so send login request to AM Service and 
                AMUserLoginRequest loginRequest = new AMUserLoginRequest();                    
                amProxy.GetSessionCompleted += delegate(object sender, GetSessionCompletedEventArgs eventArgs)
                {
                    //get sessionID from response and generate work session for Mobile Service
                    Guid session = eventArgs.Result.session_ID;
                    Debug.WriteLine(eventArgs.Result.session_ID);

                    serviceClient.Get_SessionCompleted += delegate(object sender2, Get_SessionCompletedEventArgs eventArgs2)
                    {
                        Debug.WriteLine(eventArgs2.Result);
                        String validSession = String.Format("{0}", eventArgs2.Result);
                        //store session value in preferences
                        HelperMethods.StoreStringForKey(Constants.keySessionID, validSession);
                    };
                    serviceClient.Get_SessionAsync(session);
                };
                amProxy.GetSessionAsync(loginRequest);
            }
            else
            {
                Debug.WriteLine("validating existing sessionID");
                //there is a session so check if it's still valid
                sessionRequest.session_ID = Guid.Parse(sessionID);
                sessionRequest.signature = Helper_Classes.RsaSha1Signing.Sign(sessionID);
                amProxy.CheckSessionCompleted += delegate(object sender, CheckSessionCompletedEventArgs eventArgs)
                {
                    bool status = eventArgs.Result.ok;
                    if (!status)
                    {
                        //existing session isn't valid so generate new session
                        AMUserLoginRequest loginRequest = new AMUserLoginRequest();                            
                        amProxy.GetSessionCompleted += delegate(object getsessionSender, GetSessionCompletedEventArgs getsessionEvent)
                        {
                            //get sessionID from response and generate work session for Mobile Service
                            Guid session = getsessionEvent.Result.session_ID;
                            Debug.WriteLine(getsessionEvent.Result.session_ID);

                            serviceClient.Get_SessionCompleted += delegate(object sender2, Get_SessionCompletedEventArgs eventArgs2)
                            {
                                Debug.WriteLine(eventArgs2.Result);
                                String validSession = String.Format("{0}", eventArgs2.Result);
                                //store session value in preferences
                                HelperMethods.StoreStringForKey(Constants.keySessionID, validSession);
                            };
                            serviceClient.Get_SessionAsync(session);
                        };
                        amProxy.GetSessionAsync(loginRequest);
                    }
                    else
                    {
                        //sessionID is still a good value so use that to keep working
                        serviceClient.Get_SessionCompleted += delegate(object sender2, Get_SessionCompletedEventArgs eventArgs2)
                        {
                            Debug.WriteLine(eventArgs2.Result);
                            String validSession = String.Format("{0}", eventArgs2.Result);
                            //store session value in preferences
                            HelperMethods.StoreStringForKey(Constants.keySessionID, validSession);
                        };
                        serviceClient.Get_SessionAsync(Guid.Parse(sessionID));
                    }
                };
                amProxy.CheckSessionAsync(sessionRequest);
            }
            return serviceClient;
        }

所以現在當我想在Service方法中調用一個方法時,我需要在下面做類似的事情,但是我對此卻一無所知

public void GetClientList(String agentID)
        {
            Debug.WriteLine("checking session");
            MobileServiceSoapClient serviceClient = CheckSession();
            //I need some kind of callback here or something that will wait until the CheckSession method is completed before moving on to call the service I want
           serviceClient.GetClientsAsync(agentID) //this will get called pretty much right after the first if/else statement in CheckSession so in some cases it's returning incorrect results

據我了解,CheckSession方法是異步的。

因此,您可以做兩件事:

  1. 使它返回Task<MobileServiceSoapClient>await它。 您可以使用TaskCompletionSource<MobileServiceSoapClient>並將其結果設置在適當的事件/位置。
  2. Action<MobileServiceSoapClient>參數添加到方法中,並在方法完成工作后調用它(這些位置與在選項1中設置結果的位置相同)。

我會選擇選項1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM