2016-11-25 6 views
0

Во-первых, извините за меня.
Я пытаюсь написать код для считывателя RFID, и я бы хотел использовать C# + SignalR + Owin.
У меня есть следующий код.C#, SignalR, Owin self host - я не могу отменить события

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 и если я повторно выполнить метод ReaderStart в классе MyHub, я получаю данные от читателя дважды, трижды, и т.д ..
меня там отмена подписки на этот обработчик, однако, он не имеет никакого эффекта. Есть ли у кого-нибудь идеи?

ответ

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

определяет пустое TagToClientHandler как статические должен сделать трюк, иначе, вероятно, каждый обработчик имеет другую ссылку и - = не будет удалить все

или просто установить TagToClient обнулить

rfidreader.TagToClient = null 
+0

Спасибо за ответ, однако он не работает. TagToClientHandler не может быть статическим (существует непрерывность для нестатического метода SignalR Clients.All.AnyClientFunction (tagNumber), который я забыл написать в код иллюстрации) и rfidreader.TagToClient = null тоже не работает, поскольку компилятор возвращает исключение «Событие« Speedway.TagToClient »может появляться только с левой стороны + = или - =" – skybedy

0

Экземпляры концентратора являются временными, и вы получите новый экземпляр для каждого запроса. В результате сохранение каких-либо данных, которые предполагается использовать для нескольких вызовов или подписки на события, не будет работать. У вас должен быть отдельный способ хранения вещей, чье жизненное время больше времени жизни концентратора, но все еще доступного из концентратора, так что вы можете вызывать методы из своего концентратора (самая простая вещь может быть просто статическим свойством на хабе, но вы нужно подумать, будет ли он работать, если у вас несколько клиентов, и все они начнут вызывать методы (также подумайте о потоковом)).

Обратите внимание, что класс концентратора имеет события OnConnected/OnDisconnected, которые также могут быть полезны в вашем случае для отслеживания соединений.

0

Проблема ваш статический инициализатор

static RFIDReader rfidreader = new RFIDReader(); 

С MyHub преходяще, новый экземпляр при каждом вызове. Это означает, что вы повторно инициализируете rfidreader при каждом вызове. Вы должны добавить конструктор в класс, проверить его на null и только инициализировать его, если null

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

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

... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^