Ленивый экземпляр и обработчик событий (события Singleton) - PullRequest
0 голосов
/ 25 сентября 2019

Я бы хотел обработать конкретное событие одного экземпляра с помощью отложенной загрузки.В моем примере с ленивым клиентом (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 в обработчике - но я быхотел бы узнать о лучших практиках в этом случае.

...