У меня есть соединение с веб-сокетом, и я хочу создать методы get для него.Я использовал этот пример .
Это часть модели данных:
public class Message
{
public string MessageType { get; set; }
}
public class SensorData : Message
{
public float Temperature { get; set; }
public float Humidity { get; set; }
public float Pressure { get; set; }
}
Это класс websocket:
public WebSocketConnection(string url)
{
socket = new WebSocket(url);
}
private WebSocket socket;
public int Timeout = 10000;
public void Connect()
{
socket.Connect();
socket.OnMessage += Socket_OnMessage;
}
public void Disconnect()
{
socket.Close();
socket.OnMessage -= Socket_OnMessage;
}
public event EventHandler<OnSensorDataEventArgs> SensorDataReveived;
private void Socket_OnMessage(object sender, MessageEventArgs e)
{
var msg = JsonConvert.DeserializeObject<Message>(e.Data);
switch (msg.MessageType)
{
case "other message types":
{
...
}
case "SensorData":
{
SensorDataReveived?.Invoke(this, new OnSensorDataEventArgs(JsonConvert.DeserializeObject<SensorData>(e.Data)));
break;
}
}
}
public Task<SensorData> GetSensorData()
{
var msg = JsonConvert.SerializeObject(new Message() { MessageType = "RequestSensorData" });
var tcs = new TaskCompletionSource<SensorData>();
SensorDataReveived += (sender, e) => {
tcs.SetResult(e.SensorData);
};
socket.Send(msg);
return tcs.Task;
}
Проблема заключается в методе GetSensorData.Когда вызывается socket.Send (msg), сервер websocket отвечает, и событие инициируется, но после вызова SetResult ничего не происходит.Я уже пробовал TaskCreationOptions.RunContinuationsAsynchronically и помещал SetResult в Task.Run, но это не помогло.
private async void BtnShowSensorData_Clicked(object sender, EventArgs e)
{
var sensorData = await connection.GetSensorData(); //Connection is an instance of WebSocketConnection
labelTemperature.Text = " Temperature: " + sensorData.Temperature.ToString();
labelHumidity.Text = " Humidity: " + sensorData.Humidity.ToString();
labelPressure.Text = " Pressure: " + sensorData.Pressure.ToString();
}