[英]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方法是異步的。
因此,您可以做兩件事:
Task<MobileServiceSoapClient>
並await
它。 您可以使用TaskCompletionSource<MobileServiceSoapClient>
並將其結果設置在適當的事件/位置。 Action<MobileServiceSoapClient>
參數添加到方法中,並在方法完成工作后調用它(這些位置與在選項1中設置結果的位置相同)。 我會選擇選項1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.