C# 异步服务器每秒动作
C# Async Server action every second
我已经用 C# 成功创建了一个简单的服务器和客户端应用程序,它在服务器和多个客户端之间进行异步通信,我使用了以下 Microsoft 文档来创建它:
它们都工作正常,但我的问题是,我想每秒在服务器上执行一个操作,但我不知道最好的方法。我应该使用 Timer class 之类的东西吗?使用计时器是否会以任何方式干扰服务器从客户端接收的调用?
是的,计时器是一个很好的方法。
我有一个名为 Sprite 的类似 Blazor 组件,每次计时器事件结束时我都会在其中执行图像移动。
在我的例子中,我的订阅者是一个接口,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; }
在我的开始事件中,我创建了计时器:
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;
}
}
}
刷新事件是我移动图像的地方(在我的例子中是通过随机数)。
一个提示当使用一个定时器时,它会经常响起,我通常会放一些像 NotificationInProgress 标志之类的东西,以防一个操作花费的时间超过一秒。
也许在您的用例中可以有多个消息,但有时您需要等待一条消息完成才能完成下一条消息。
public bool NotificationInProgress { get; set; }
然后在您通知订阅者之前我会测试
if (!NotificationInProgress)
{
// send your message.
}
如果您想查看开源 Blazor 示例项目,我在其中演示了此代码的简单动画,请访问此处:
https://github.com/DataJuggler/DataJuggler.Blazor.Components
也许它会给你一些关于如何安排你的项目的想法。
我建议使用某种形式的 Thread.Sleep 或在带有 Task.Delay 的方法上调用 await。请参阅示例 here。
我已经用 C# 成功创建了一个简单的服务器和客户端应用程序,它在服务器和多个客户端之间进行异步通信,我使用了以下 Microsoft 文档来创建它:
它们都工作正常,但我的问题是,我想每秒在服务器上执行一个操作,但我不知道最好的方法。我应该使用 Timer class 之类的东西吗?使用计时器是否会以任何方式干扰服务器从客户端接收的调用?
是的,计时器是一个很好的方法。
我有一个名为 Sprite 的类似 Blazor 组件,每次计时器事件结束时我都会在其中执行图像移动。
在我的例子中,我的订阅者是一个接口,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; }
在我的开始事件中,我创建了计时器:
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;
}
}
}
刷新事件是我移动图像的地方(在我的例子中是通过随机数)。
一个提示当使用一个定时器时,它会经常响起,我通常会放一些像 NotificationInProgress 标志之类的东西,以防一个操作花费的时间超过一秒。
也许在您的用例中可以有多个消息,但有时您需要等待一条消息完成才能完成下一条消息。
public bool NotificationInProgress { get; set; }
然后在您通知订阅者之前我会测试
if (!NotificationInProgress)
{
// send your message.
}
如果您想查看开源 Blazor 示例项目,我在其中演示了此代码的简单动画,请访问此处:
https://github.com/DataJuggler/DataJuggler.Blazor.Components
也许它会给你一些关于如何安排你的项目的想法。
我建议使用某种形式的 Thread.Sleep 或在带有 Task.Delay 的方法上调用 await。请参阅示例 here。