2016-11-25 10 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を定義 - =何も

か、単に

rfidreader.TagToClient = null 
+0

回答ありがとうございます。 TagToClientHandlerは静的にすることはできません(図形コードに書き込むことを忘れた非静的なSignalRメソッドClients.All.AnyClientFunction(tagNumber)には連続性があります)、rfidreader.TagToClient = nullも機能しません。 "イベント 'Speedway.TagToClient'は、+ =または - =" – skybedy

0

をnullにTagToClientを設定は削除されませんハブインスタンスは一時的なものであり、リクエストごとに新しいインスタンスが作成されます。その結果、複数のコールで使用される予定のあらゆる種類のデータを格納したり、イベントに登録したりすることはできません。ハブのライフタイムより長いが、ハブからアクセス可能なものを保存するための別の方法が必要です(最も簡単なことは、ハブの静的なプロパティかもしれませんが、あなたが複数のクライアントを持っていて、すべてがメソッドを呼び出す(スレッド化についても考える)ようになるなら、それがうまくいくかどうか考える必要があります。

Hubクラスには、OnConnected/OnDisconnectedイベントがあります。このイベントは、接続を追跡する場合にも役立ちます。 MyHubが一時的であるので

0

問題はあなたの静的初期化子

static RFIDReader rfidreader = new RFIDReader(); 

で、新しいものは、すべての呼び出しでインスタンス化されます。つまり、すべての呼び出しでrfidreaderを再初期化します。クラスにコンストラクタを追加し、nullをチェックし、nullの場合にのみ初期化する必要があります。

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

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

... 
} 
関連する問題