Похоже, идеальный рецепт для делегатов - в частности, обратные вызовы с делегатами именно так и обрабатываются в асинхронном шаблоне в .NET.
Вызывающий обычно передает вам некоторое состояние и делегата, и вы сохраняете их обоих в любом контексте, который у вас есть, затем вызываете делегата, передавая ему состояние и любой результат, который у вас может быть.
Вы можете либо сделать состояние просто object
, либо потенциально использовать универсальный делегат и принять состояние соответствующего типа, например,
public delegate void Callback<T>(T state, OperationResult result)
Тогда:
public void DoSomeOperation(int otherParameterForWhateverReason,
Callback<T> callback, T state)
Поскольку вы используете .NET 3.5, вы можете использовать существующие Func<...>
и Action<...>
типы делегатов, но вы можете найти, что вам будет проще объявить свой собственный. (Название может прояснить, для чего вы его используете.)