1

デジタル スケールに接続されたシステムがあり、SignalR を使用して重量を要求している他のクライアントに渡そうとしています。

私のハブは次のようになります。

public class ScaleHub : Hub
{
    private static string ScaleClientId { get; set; }

    // the weight object for the client making the request
    private static Dictionary<string, WeightDTO> scaleWeights =
        new Dictionary<string, WeightDTO>();

    public void RegisterScale()
    {
        ScaleClientId = Context.ConnectionId;
    }

    public WeightDTO GetWeight()
    {
        // clear the scale weight for the client making the request
        scaleWeights[Context.ConnectionId] = null;

        Task updateWeightTask = Clients[ScaleClientId].UpdateWeight(Context.ConnectionId);

        // this doesn't wait :-(
        updateWeightTask.Wait();

        return scaleWeights[Context.ConnectionId];
    }

    public void UpdateWeight(WeightDTO weight, string clientId)
    {
        // update the weight for the client making the request
        scaleWeights[clientId] = weight;
    }
}

クライアントの重要な部分は次のとおりです。

scaleHub.On<string>("UpdateWeight", UpdateWeight);

private void UpdateWeight(string clientId)
{
    // this is replaced with code that talks to the scale hardware
    var newWeight = new WeightDTO(123, WeightUnitTypes.LB);

    scaleHub.Invoke("UpdateWeight", newWeight, clientId).Wait();
}

public Task<WeightDTO> GetWeight()
{
    return scaleHub.Invoke<WeightDTO>("GetWeight");
}

私はまだSignalRに慣れていないので、これが正しい方法であるかどうかわかりません。

Thread.Sleep(2000)問題を解決する代わりに追加updateWeightTask.Wait()すると、UpdateWeight への往復呼び出しが完了するのに十分な時間が得られるためです。クライアントに体重を測るのに 2 秒も待たせたくありません。

助言がありますか?

4

0 に答える 0