Reputation: 55
I'm trying to execute code after yield return. I have WebMethod that call's another method and I want to do some staff after returning value to WebMethod (execute method setNextCampaign()) Here is my code:
[WebMethod]
public long NextCall(long UserID)
{
CampaignManagerExtended cacheCampaignManager = fillCampaignManager(false);
return cacheCampaignManager.NextCall(UserID).First();
}
public IEnumerable<long> NextCall(long UserID)
{
UserExtended ue = null;
try
{
if (!CacheUsers.ContainsKey(UserID))
AddUser(UserID);
ue = CacheUsers.First(p => p.Key == UserID).Value;
if (ue.NextCampaign != null)
{
QueueItemPersonal qp = ue.NextFromPersonalQueue();
if (qp != null)
{
yield return qp.CampaignPersonID;
}
else
{
QueueItemScheduled qs = ue.NextCampaign.NextFromScheduleQueue();
if (qs != null)
{
yield return qs.CampaignPersonID;
}
else
{
QueueItemGeneral qg = ue.NextCampaign.NextFromGeneralQueue();
if (qg != null)
{
yield return qg.CampaignPersonID;
}
else
yield return 0;
}
}
ue.NextCampaign.fillGeneralQueue();
ue.setNextCampaign();
}
else
yield return 0;
}
//catch
//{
// yield return 0;
//}
finally
{
}
}
Any ideas?
Upvotes: 2
Views: 8287
Reputation: 4678
Just save the yeild until you are ready to return it:
[WebMethod]
public long NextCall(long UserID)
{
CampaignManagerExtended cacheCampaignManager = fillCampaignManager(false);
return cacheCampaignManager.NextCall(UserID).First();
}
public IEnumerable<long> NextCall(long UserID)
{
int returnID;
UserExtended ue = null;
try
{
if (!CacheUsers.ContainsKey(UserID))
{
AddUser(UserID);
}
ue = CacheUsers.First(p => p.Key == UserID).Value;
if (ue.NextCampaign != null)
{
QueueItemPersonal qp = ue.NextFromPersonalQueue();
if (qp != null)
{
returnID = qp.CampaignPersonID;
}
else
{
QueueItemScheduled qs = ue.NextCampaign.NextFromScheduleQueue();
if (qs != null)
{
returnID = qs.CampaignPersonID;
}
else
{
QueueItemGeneral qg = ue.NextCampaign.NextFromGeneralQueue();
if (qg != null)
{
returnID = qg.CampaignPersonID;
}
else
{
returnID = 0;
}
}
}
ue.NextCampaign.fillGeneralQueue();
ue.setNextCampaign();
}
else
{
returnID = 0;
}
yield return returnID;
}
//catch
//{
// yield return 0;
//}
finally
{
}
}
Upvotes: 2
Reputation: 16769
Instead of this
<some stuff>;
yield return <something>;
<some epilog stuff that should be executed after yield>
do this:
try
{
<some stuff>;
yield return <something>;
}
finally
{
<some epilog stuff that should be executed after yield>
}
Upvotes: 5