Какая синхронизация лучше для асинхронного метода?
Пытаюсь сделать свой класс на основе асинхронного метода 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 шаблон вроде не очень подходит?