Какая синхронизация лучше для асинхронного метода?

Пытаюсь сделать свой класс на основе асинхронного метода System.Net.HttpClient.GetAsync

using System.Net;
using System.IO;
using System.Net.Http.Headers;
using System.Net.Http;

    public class MyConnet
    {
        private string secret;
        private string baseUrl = "https://users.mysite.my";
        public string path { get; private set; }
        private HttpClient client;

        public MyConnet(string setSecret, string setPath)
        {
            secret = setSecret;
            path = setPath;
            client = new HttpClient();
        }

        public async void GetUser(string UserInfoPath)
        {
            Uri url = new Uri(baseUrl + UserInfoPath);
            try
            {                
                HttpResponseMessage response = await client.GetAsync(url);
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                /*
                                //Допустим я тут сделал проверку, пакет пришёл нормальный. Тогда
                                this.MessageForEvent = "Пакет пришёл";
                                this.MyEvent(MessageForEvent);*/
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("\nException Caught!");
                Console.WriteLine("Message :{0} ", e.Message);
            }
        }
    }

Как лучше сделать синхронизацию? Прикрутить события к данному классу? Он маловат для этого. Хотелось бы, чтобы он вызывал событие, которое описано в вызывающем потоке:

public delegate void MyEventSendMessageDelagate(string SomeMessageinEvent);
public event MyEventSendMessageDelagate MyEvent;
public string MessageForEvent = "NULL";
MyConnet UserManage=new MyConnet("HashOfPass","/Users/");
....
UserManage.GetUser("/id/secondName"); //+Передать информацию о событии или вызывающем потоке... Что?

 MyEvent += (s2) =>
            {
              //Обработчик пакета в основном коде.
             }

UPD добавил код
Суть синхронизации сводится к данным по событиям WebSocket.OnMessage и данные, которые получаю асинх методом HttpClient.GetAsync(url).

    public partial class Form1 : Form
    {
        public delegate void MyEventSendMessageDelagate(string SomeMessageinEvent);
        public event MyEventSendMessageDelagate MyEvent;
        public string MessageForEvent = "NULL";
        public bool FlagMain = false;//флаг признака начала второй части программы, когда к сайтам подключился
        public Form1()
        {
            InitializeComponent();
            MyEvent += (s2) =>//пользовательское событие
            {
                if (!FlagMain)
                {
                    if (MessageForEvent == "Обработка пакетов начальная")//После начинаем "Текущую работу". То есть основную. Cas'ом
                                                                         //  Запускаем таск с постоянной обработкой пакетов. Ошибки как обраб - ивентами...
                    {
                        Site1_DataPrice.Apply_Decerialized(depthPackets[iPaketov - 1]);//depthPackets-буфер пакетов WebSocket
                        FlagMain = true;
                    }
                }
                else
                {
                    switch (MessageForEvent)
                    {
                        case "Phase1":
                        case "Увеличить частоту запросов":
                            break;
//Здесь предполагается много case'ов, данных и состояний много будет
                    }
                }
            };
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WebSocket webSocket = new WebSocket("wss://Site1.my");
            MyConnet Site2 = new MyConnet("Api","Secret","/Users/prices/");

            webSocket.OnMessage += (sender1, e1) =>
            {
             Action action1 = () => MyEvent(sMessageForEvent);
               if ((iPaketov > 5) && (bStartinit))
                    {
                        //Обработка пакетов..
                        b5PacketsRecieved = true;
                    }
              if (b5PacketsRecieved)
                    {
                      MessageForEvent = "Инициализация прошла";
                      Invoke(action1);//Вызываем польз СОБЫТИЕ
                    }
            };
        }
    }
/*******/
    public class MyConnet
    {
        private string apiKey;
        private string secret;
        private string baseUrl = "https://Site2.my";
        public string path { get; private set; }
        //"/v2/trading/placeOrder"
        private WebRequest request;
        private HttpClient client;

        public MyConnet(string setapiKey, string setSecret, string setPath)
        {
            apiKey = setapiKey;
            secret = setSecret;
            path = setPath;
            request = WebRequest.Create(baseUrl + path);
        }

        public async void GetOB(string instrument, string limit)
        {
            Uri url = new Uri(baseUrl);
            try
            {
                HttpResponseMessage response = await client.GetAsync(url);
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                "После проверки вызов события MyEvent("пришёл пакет")"
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("\nException Caught!" + e.Message);
            }
        }
    }

TAP шаблон вроде не очень подходит?


Ответы (0 шт):