2016-11-25 58 views
0

首先,我很抱歉給我英語。
我嘗試爲RFID閱讀器編寫代碼,我想使用C#+ SignalR + Owin。
我有以下代碼。C#,SignalR,Owin自我主持人 - 我無法記錄事件

namespace SignalRSelfHost { 
    using System; 
    using Microsoft.Owin.Hosting; 
    using Microsoft.AspNet.SignalR; 
    using Owin; 
    using Microsoft.Owin.Cors; 
    using ReaderSDK; 


    class Program{ 
     static void Main(string[] args) { 
     using (WebApp.Start<Startup>("http://localhost:8080/")) { 
      Console.WriteLine("Server running at http://localhost:8080/"); 
      Console.ReadLine(); 
     } 
     } 
    } 

    public class Startup { 
     public void Configuration(IAppBuilder app) { 
     app.UseCors(CorsOptions.AllowAll); 
     app.MapSignalR(); 
     } 
    } 

    //class for basic reader settings with reader event + event handler 
    public class RFIDReader { 
     public Reader reader = new Reader(); 
     //definition event, what I'll fire for MyHub class 
     public event Action<string> TagToClient; 

     public RFIDReader() { 
     try { 
      //connect to reader 
      reader.Connect("xx.xx.xx.xx"); 
      // event from reader and handler 
      reader.TagsComing += TagsComingHandler; 
     } 
     catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 
     } 

     //handler for event readerTagsComming 
     void TagsComingHandler(Reader sender, Tags packet) { 
     foreach (Tag tag in packet) { 
      //fire event for MyHub class 
      TagToClient(tag.toString()); 
     } 
     } 
    } 

    //MyHub class for communication via SignalR 
    public class MyHub : Hub { 
     static RFIDReader rfidreader = new RFIDReader(); 

     // this method is activated from JavaScript client of course 
     // JavaScript client code is not relevant for this example 
     public void ReaderStart() { 
     //start of reader reads 
     rfidreader.start(); 
     //here I want unsucribe handler - it doesn't works 
     rfidreader.TagToClient -= TagToClientHandler; 
     //here I subcribe handler 
     rfidreader.TagToClient += TagToClientHandler;  
     } 


     //handler for event TagToClient 
     void TagToClientHandler(string tagNumber){ 
     Console.WriteLine(tagNumber); 
     } 


     //this method is also activated from JavaScript client 
     public void ReaderStop() { 
     //stop of readers reads 
     rfidreader.stop(); 
     } 

    } 

} 

我的問題是,我不能unsucribe事件處理程序TagToClientHandler如果我反覆MyHub類執行方法ReaderStart,我從讀者數據兩次,三次,等。
我有取消訂閱此處理程序,但是,它不起作用。 有人有什麼想法嗎?

回答

0
static void TagToClientHandler(string tagNumber){ 
    Console.WriteLine(tagNumber); 
} 

定義無效TagToClientHandler靜態應該做的伎倆,否則可能每次處理程序還有一個參考和 - =不會刪除任何

或只設置TagToClient爲null

rfidreader.TagToClient = null 
+0

感謝您的答案,但它不起作用。 TagToClientHandler不能是靜態的(對於非靜態的SignalR方法Clients.All.AnyClientFunction(tagNumber),我忘記寫入illustratice代碼),而rfidreader.TagToClient = null也不會起作用,因爲compiller返回異常「事件'Speedway.TagToClient'只能出現在+ =或 - =」的左側 – skybedy

0

Hub實例是暫時的,您將爲每個請求獲得一個新實例。因此,存儲任何類型的應用於多個呼叫或訂閱事件的數據都不會起作用。您需要有一種獨立的方式來存儲生命週期比Hub的生命週期長但仍可從Hub訪問的事物,以便您可以從集線器調用方法(最簡單的事情可能只是集線器上的靜態屬性,但您需要考慮如果它有效,如果你有多個客戶端,他們都將開始調用方法(也考慮線程))。

請注意,Hub類具有OnConnected/OnDisconnected事件,在您的情況下也可以用於跟蹤連接。

0

的問題是你的靜態初始化

static RFIDReader rfidreader = new RFIDReader(); 

由於MyHub是短暫的,一個新的在每次調用實例化。這意味着您在每次調用時都會重新初始化rfidreader。您應該添加一個構造函數到類,檢查爲空,只有初始化它,如果爲空

public class MyHub : Hub { 
    static RFIDReader rfidreader = null; 

    public MyHub() { 
     if (rfidreader == null) { 
     rfidreader = new rfidreader(); 
    } 

... 
}