簡體   English   中英

WCF雙工客戶端空閑不會更新用戶界面

[英]WCF Duplex client idle wont update userinterface

我的客戶端多數民眾贊成在連接到雙工wcf服務24/6,它在每個星期日重新啟動。 在客戶端iam中使用listview顯示一些信息。 listview項目源綁定到自定義的ObservableCollection。 客戶端每分鍾都會對wcf服務調用一個keepalive方法。

我的問題是,當客戶端中有活動時,客戶端工作正常。 但是,當沒有活動並且應用程序僅運行keepalive方法大約10-16小時時。 而且IAM試圖向列表視圖添加和刪除數據,似乎沒有任何效果。 但是記錄方法添加和刪除的wcf服務運行良好。 就像用戶界面沒有更新一樣。 當我重新啟動應用程序時,一切正常。

我該如何解決這個問題?

我的自定義ObservableCollection對象代碼:

    public class ObservableOrderResponseQueue : INotifyCollectionChanged, IEnumerable<OrderResponse>
{
    public event NotifyCollectionChangedEventHandler CollectionChanged = (o, e) => { };
    private List<OrderResponse> _list = new List<OrderResponse>();

    /// <summary>
    /// Adds to the list.
    /// </summary>
    /// <param name="orderResponse">OrderResponse.</param>
    public void Add(OrderResponse orderResponse)
    {
        //Only 6 items in list is possible if more then 6 remove the first item.
        if (_list.Count >= 6)
        {
            RemoveAt(0);
        }

        this._list.Add(orderResponse);            

        CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, orderResponse, (_list.Count - 1)));
    }

    /// <summary>
    /// Remove from list.
    /// </summary>
    /// <param name="index">Item index to remove.</param>
    public void RemoveAt(int index)
    {
        OrderResponse order = this._list[index];
        this._list.RemoveAt(index);

        CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, order, index));
    }

    /// <summary>
    /// Remove from list.
    /// </summary>
    /// <param name="orderResponse">Item to be removed.</param>
    public void Remove(OrderResponse orderResponse)
    {
        if (_list.Count == 0) return;

        var item = _list.Where(o => o.OrderDetail.TrayCode == orderResponse.OrderDetail.TrayCode).FirstOrDefault();
        int index = _list.IndexOf(item);

        if (index == -1) return;

        CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));

        this._list.RemoveAt(index);
    }

    #region IEnumerable<OrderResponse> Members

    public IEnumerator<OrderResponse> GetEnumerator()
    {
        return _list.GetEnumerator();
    }

    #endregion

    #region IEnumerable Members

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _list.GetEnumerator();
    }

    #endregion


}

這是我將usercontrol綁定到類的方式。

            //Set up client callbacks events
        App.clientBack.ClientNotified += new ClientNotifiedEventHandler(clientBack_ClientNotified);
        App.clientBack.AddToDisplayEvent += new AddToDisplayEventHandler(clientBack_AddToDisplayEvent);
        App.clientBack.RemoveFromDisplayEvent += new RemoveFromDisplayEventHandler(clientBack_RemoveFromDisplayEvent);
        App.clientBack.UpdateQueueDisplayEvent += new UpdateQueueDisplayEventHandler(clientBack_UpdateQueueDisplayEvent);


        //Show one chair or many.
        if (_settings.IsOneChair)
        {
            userControlOneChair.ItemSource = _queueProductionItems;
        }
        else
        {
            userControlChairs.ItemsSource = _queueProductionItems;
        }

刪除和添加方法

        void clientBack_RemoveFromDisplayEvent(object sender, RemoveFromDisplayEventArgs e)
    {
        try
        {
            _logger.Info("Remove from display.");

            userControlChairs.Dispatcher.Invoke((Action)(() =>
            {
                _queueProductionItems.Remove(e.OrderResponse);
            }));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void clientBack_AddToDisplayEvent(object sender, AddToDisplayEventArgs e)
    {
        try
        {
            _logger.Info("Add to display.");

            userControlChairs.Dispatcher.Invoke((Action)(() =>
            {
                _queueProductionItems.Add(e.OrderResponse);
            }));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

感謝幫助!

我所做的是實現心跳機制。 一切都解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM