i need to call a non-static method from an async operation ,
for ease i’m using apm design , by defining a delegate assign it an anonymous method
and calling beginInvoke on it .
to my surprise i could not reference a non-static method from my implementation
any idea why that is ?
public delegate void UpdatePlayersLogin(IServerCallback callback, Guid callback_playerId, Player player, List<IServerCallback> toRemove, ManualResetEvent handel);
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant , InstanceContextMode = InstanceContextMode.PerSession)]
public class ServerService : IServer
{
UpdatePlayersLogin updateLogin = (callback, callback_playerId, player, toRemove, handle) =>
{
try
{
callback.PlayerChangedStatus(player);
}
catch (Exception)
{
RemovePlayer(callback, callback_playerId, toRemove);
}
finally
{
handle.Set();
}
};
.
.
private void RemovePlayer(IServerCallback callback, Guid playerId, List<IServerCallback> toRemove)
{ . . . . . . }
private void NotifyPeersOfClientLogin(Player player)
{
. . . . .
foreach (var key_CallBackPair in players)
{
handels[i] = new ManualResetEvent(false);
updateLogin.BeginInvoke(key_CallBackPair.Value, key_CallBackPair.Key, player, toRemove, handels[i], null, null);
. . . . .
}
.....
}
is there a way i could reference the non-static method ?
That should be fine if the lambda expression itself is within an instance method… but if it’s in a static method, then what instance do you expect
RemovePlayerto be called on?(As an aside,
update_players_loginis a highly unconventional type name.UpdatePlayersLoginwould be better.)EDIT: Okay, my guess is that you’re declaring an instance variable, like this:
If that’s not the case, please clarify your post, because it’s missing important information at the moment.
If that is the case, the problem is just that an instance variable initializer can’t refer to
this… but you can initialize it in the constructor instead:I would also make the field
readonlyunless you intend to reassign it somewhere else.