C# Asyn c Действие сервера каждую секунду - PullRequest
0 голосов
/ 28 февраля 2020

Я успешно создал простое серверное и клиентское приложение в C#, которое асинхронно обменивается данными между сервером и несколькими клиентами, для его создания я использовал следующие документы Microsoft:

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-client-socket-example

Они оба работают нормально, но мой вопрос, я хочу выполнять действие каждую секунду на сервере, и я не Я не знаю лучшего способа go об этом. Должен ли я использовать что-то вроде Timer класса, чтобы сделать это? Может ли использование таймера каким-либо образом влиять на вызовы, которые сервер получает от клиентов?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Я бы предложил использовать некоторую форму Thread.Sleep или вызвать await для метода с Task.Delay. Смотрите пример здесь .

0 голосов
/ 28 февраля 2020

Да, таймер - это хороший способ.

У меня есть нечто похожее для компонента Blazor, называемого Sprite, где я выполняю перемещение изображения каждый раз, когда происходит событие таймера.

В моем случае мой подписчик - это интерфейс ISpriteSubscriber:

namespace DataJuggler.Blazor.Components.Interfaces
{

    #region interface ISpriteSubscriber
    /// <summary>
    /// This interface is used by the AnimationManager to notifiy callers that a refresh occurred.
    /// </summary>
    public interface ISpriteSubscriber
    {

        #region Methods

            #region Refresh()
            /// <summary>
            /// This method will call StateHasChanged to refresh the UI
            /// </summary>
            void Refresh();
            #endregion

            #region Register(Sprite sprite)
            /// <summary>
            /// This method is called by the Sprite to a subscriber so it can register with the subscriber, and 
            /// receiver events after that.
            /// </summary>
            void Register(Sprite sprite);

        #endregion

        #endregion

        #region Properties

            #region ProgressBar
            /// <summary>
            /// This is used so the ProgressBar is stored and available to the Subscriber after Registering
            /// </summary>
            ProgressBar ProgressBar { get; set; }
            #endregion

        #endregion

    }
    #endregion

}

public ISpriteSubscriber Subscriber { get; set; }

В моем событии Start я создаю Таймер:

public void Start()
{
    this.Timer = new Timer();
    this.Timer.Interval = this.interval;
    this.Timer.Elapsed += Timer_Elapsed;
    this.Timer.Start();
}

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    // if a subscriber (returns true if Subscriber != null)
    if (HasSubscriber)
    {
        // Notify Subscriber
        Subscriber.Refresh();
    }
}

public void Refresh()
{
    // do your actions here
}

public void Register(Sprite sprite)
{
    // If the sprite object exists
    if (NullHelper.Exists(sprite))
    {
        // if this is the RedCar
        if (sprite.Name == "RedCar")
        {
            // Set the RedCar
            RedCar = sprite;
        }
        else 
        {
            // Set the WhiteCar
            WhiteCar = sprite;
        }
    }
}

Событие Refre sh - это то, куда я перемещаю изображение (случайными числами в моем примере).

Один совет При использовании таймера, который срабатывает так часто, как у вас, я обычно ставлю что-то вроде флага NotificationInProgress или что-то в случае, если одна операция занимает больше секунды.

Возможно в вашем В случае использования можно иметь несколько сообщений, но иногда вам нужно подождать, пока одно из них не закончится sh, прежде чем завершить следующее.

public bool NotificationInProgress { get; set; }

Затем, прежде чем уведомить подписчика, я проверяю

if (!NotificationInProgress)
{
    // send your message.
}

Если вы хотите увидеть пример проекта Blazor с открытым исходным кодом, где я демонстрирую простые анимации, из которых получен этот код, он находится здесь:

https://github.com/DataJuggler/DataJuggler.Blazor.Components

enter image description here

Возможно, это даст вам некоторые идеи о том, как организовать ваш проект.

...