我正在做一个Websocket客户端。
客户端订阅了多个渠道,渠道发送给我的客户端的数据由分配给每个订阅者的每个线程处理。
接下来,每个线程都会使用处理后的数据发生UI刷新事件。但是,当所有通道立即发送太多数据时,UI线程(也许)无法处理UI刷新事件,并且无法停止或在监视中变慢。因此,我发布了我的问题并得到了这样的答案:“您应该创建事件队列。您可以使UI线程处理事件队列中的唯一任务。负责Websocket的线程也应该处理自己的任务。”
但是我不能适当地修改我的代码。因此,我向您展示我的代码,希望得到您的评论。
下面是用于订阅数据的interface(?)类的当前代码。订阅线程将调用更新方法。
public static class TradeInterface
{
public delegate void SetTradeHandler(DateTime Time, double? Price, long Amount);
public static event SetTradeHandler SetTradeData;
Queue<SetTradeHandler> TradeUpdateEventQueue = new Queue<SetTradeHandler>();
public static void Update(DateTime Time, double? Price, long Amount)
{
if (SetTradeData != null)
SetTradeData(Time, Price, Amount);
}
}
此外,接下来是添加事件处理程序的形式化代码
private void TradingWindow_Load(object sender, EventArgs e)
{
...
TradeInterface.SetTradeData += new TradeInterface.SetTradeHandler(UpdateRecentTrade);
}
private void UpdateRecentTrade(DateTime Time, double? Price, long Amount)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new TradeInterface.SetTradeHandler(UpdateRecentTrade),
new object[] { Time, Price, Amount });
}
else
{
// recentTrade is UserControl
if (recentTrade.IsInitialized())
{
recentTrade.Update(Time, Price, Amount);
recentTradeInitPanel.Visible = false;
}
else
{
if (recentTrade.Width > 0)
recentTrade.Init(recentTrade.Width);
}
}
}
最后,数据在UserControl中使用。
public void Update(DateTime Time, double? Price, long Amount)
{
if (IsInitialized())
{
ListViewItem item = new ListViewItem($"{Time.ToLocalTime():hh:mm:ss:fff}");
item.SubItems.Add($"{Price}");
item.SubItems.Add($"{Amount}");
recentList.Items.Insert(0, item);
...
}
}
如何修改此代码以进行连续,不间断的UI刷新?