如何在C#

时间:2018-07-05 05:05:45

标签: c# multithreading events websocket

我正在做一个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刷新?

0 个答案:

没有答案