Я бы хотел обработать конкретное событие одного экземпляра с помощью отложенной загрузки.В моем примере с ленивым клиентом (POC of HttpClient) вызвать событие OnComplete (OnFault / Onstart) я должен обработать эти события в техническом классе процессора, техническиtask
public class Processor
{
private API _api;
private volatile int Id;
public void ProcessorDo(int id)
{
_api = new API();
_api.OnComplete += _api_OnComplete;
Id = id;
_api.ApiDo(id);
}
private void _api_OnComplete(object sender, int e)
{
Console.WriteLine($"TaskId {Id} - ClientId {e}");
}
}
public class API
{
public event EventHandler<int> OnComplete
{
add
{
_client.OnComplete += value;
}
remove
{
_client.OnComplete -= value;
}
}
private Client _client;
public API()
{
_client = Client.Instance;
}
public void ApiDo(int id)
{
_client.ClientDo(id);
}
}
public class Client
{
private static readonly Lazy<Client> InstanceLazy = new Lazy<Client>(() => new Client(), true);
public static Client Instance => InstanceLazy.Value;
public event EventHandler<int> OnComplete;
public void ClientDo(int id)
{
Task.Delay(1000);
Volatile.Read(ref OnComplete)?.Invoke(this, id);
}
}
class Program
{
static void Main(string[] args)
{
var tasks = new List<Task>();
tasks.Add(Task.Run(() => new Processor().ProcessorDo(1)));
tasks.Add(Task.Run(() => new Processor().ProcessorDo(2)));
tasks.Add(Task.Run(() => new Processor().ProcessorDo(3)));
var result = Task.WhenAll(tasks);
result.Wait();
Console.WriteLine("Done!");
Console.ReadKey();
}
}
Токовый выход:
TaskId 1 - ClientId 1
TaskId 1 - ClientId 2
TaskId 2 - ClientId 1
TaskId 3 - ClientId 1
TaskId 2 - ClientId 2
TaskId 3 - ClientId 2
TaskId 1 - ClientId 3
TaskId 2 - ClientId 3
TaskId 3 - ClientId 3
Ожидается (требуется Lazy):
TaskId 1 - ClientId 1
TaskId 2 - ClientId 2
TaskId 3 - ClientId 3
Также я могу отслеживать его по Id в обработчике - но я быхотел бы узнать о лучших практиках в этом случае.