TaskCompletionSource никогда не завершается - PullRequest
0 голосов
/ 26 октября 2018

У меня есть соединение с веб-сокетом, и я хочу создать методы 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();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...