2019年2月5日 星期二

凱基API QuoteCom和TradeCom共存

導言:
因Package版本不一致,造成「參考」時的大混亂。
QuoteCom的Package版本是1.0.6.3
TradeCom的Package版本是1.0.6.8
只要引用最新版的Package(1.0.6.8)問題就解決了

問題:
在Log檔中發現
[P:PushClient FeedPkgThread OnRcvData Exception1503]
造成TradeCom的事件無法正常運作,特別是資料接收( OnRcvMessage)
而接收主機時間(OnRcvServerTime)的Event又正常運作。
所以這問題變的不知所云,因為錯誤清單完全沒有出現錯誤。


Step 1:問題點Package版本不同



Step 2:取最新的Package(1.0.6.8)來加入參考,捨棄Package(1.0.6.3)版
把KGI的四個dll加入參考
Package.dll
PushClient.dll
QuoteCom.dll
TradeCom.dll


Step 3:額外的dll放在同目錄
有兩個dll不能引用進參考,只能放在同目錄。
ICSharpCode.SharpZipLib.dll
Interop.KGICGCAPIATLLib.dll


總結:
這個Package.dll版本錯亂,花了很多時間才解決。一度懷疑報價與交易不能共存在同一類別(class)中。

記得先把所有資料匣(專案目錄、debug目錄、release目錄)中的dll檔全清光,有時visual studio建置時,不會重抓dll。


參考資料:無

Visual Studio 必須經過強式簽署才能標記成必要條件

導言:
我也不知道這什麼?
偵錯時出現這段話:「必須經過強式簽署才能標記成必要條件」


Step 1:解決方法
[專案]→[屬性]→[安全性]→取消[啟用ClickOnce安全性設定]






總結:
解決就好。


參考資料:無

2019年2月3日 星期日

C# 事件(event)發行(publish)訂閱(subscribe)

導言:
記錄Evnet的簡單範例

Step 1:程式碼

//接收方
class 範例_事件
{
    來源者 t = new 來源者();
    public 範例_事件()
    {
        t.發行事件 += 訂閱事件;
    }
    public void 訂閱事件(object sender, string e)
    {
        //處理訂閱資料
    }
}
//發行方
public class 來源者
{
    public event EventHandler<string> 發行事件;
    public void 做事()
    {
        觸發事件("ABC");
    }
    protected virtual void 觸發事件(string e)
    {
        EventHandler<string> 處理 = 發行事件;
        if (處理 != null)
        {
            處理(this, e);
        }
    }
}





總結:
大家作的範例都好複雜,我把呼叫事件作出最簡單化。
微軟文件依然保持著,不知所云的特性。
連標題都不知在說什麼(HOW TO:發行符合 .NET Framework 方針的事件),
讓你找不到範例。 

概念很簡單,在來源的class中製作一個事件(event)。
然後在目前的class使用「+=」來訂閱事件。
當來源class觸發時,目前的class能接到這事件然後處理。
如果不使用event的話,就必須定期監看來源class是否有變動(被動式)。
一來慢一步,二來耗損資源。事件就是主動發送訊息給下游。

參考資料: