2013-02-21 46 views
0

如果事實證明這是一個非常愚蠢的問題,但我剛剛開始強迫自己使用Entity Framework(我知道我還有很長的路要走),但我很抱歉,已經落在第一個障礙。Enitity Framework - Events問題

我正在編寫的程序僅僅是觀察一個PLC的真實情況。當它成爲true時,事件觸發,然後值(隨機)將被輸入到SQL中。然後我把這個位設置爲false。

我遇到的問題是事件觸發一次,條目被添加,位被設置爲false。但事件再也不會觸發。如果我註釋掉所有的SQL位,然後將該位設置爲false,那麼它將完美工作並多次觸發。

這裏是我得到的大部分代碼。

任何幫助將非常感激。

static void Main(string[] args) 
{ 
    PlcListener plcListener = new PlcListener(); 
    plcLister.BitChanged += (bitVal) => On_BitChanged(bitVal, plcListener) 
    plcListner.Start(); 
} 

private static void On_BitChanged(bool bitVal, PlcListener plcListner) 
{ 
    SqlEntities sqlEntity = new SqlEntities(); 
    SampleData sampleData = new SampleData(){ Data = new Random().Next(); }; 

    sqlEntity.AddToSampleDatas(sampleData); 
    sqlEntity.SaveChanges(); 

    plcListener.Confirm(); 
} 



public class PlcListener 
{ 
    public void Start() 
    { 
     OPCServer opcServer = new OPCServer(); 
     opcServer.DataChanged += On_DataChanged; 
    } 

    public void Confirm() 
    { 
     //Code to set bit to false 
    } 

    public void On_DataChanged(bool bitVal.......) 
    { 
     if(bitVal) 
     { 
      BitChangedEventHandler handler = BitChanged; 
      if (handler != null) 
      { 
       handler(bitVal); 
      } 
     } 
    } 

    public delegate void BitChangedEventHandler(bool bitValue); 
    public event BitChangedEventHandler BitChanged; 
} 

感謝

+1

爲什麼你的OnBitChanged()是靜態的? – 2013-02-21 15:19:11

+0

@Azhar因爲它是從靜態的Main()調用的?我真的很愚蠢嗎?我以爲我無法從靜態上下文中調用非靜態方法? – 2013-02-21 15:44:44

+0

順便說一句,我嘗試創建一個非靜態的BitChangedHelper類,其中包含On_BitChanged中的代碼。於是我創建了一個新的BitChangedHelper,並調用了方法HandleBit(); – 2013-02-21 16:09:26

回答

0

你沒有提到你正在使用的OPC服務器組件,但最有可能的問題是DataChange進入一個COM回調線程的應用程序,你不能寫回COM處理回調。您只需記錄傳入值並在自己的處理程序線程中執行實際處理,然後在PLC中將該位設回爲false。

+0

這也是我最初的想法,但是當事件第一次觸發時,位會被設置爲false,即plcListener.Confirm();如果On_BitChanged ()方法只包含plcListener.Confirm();一切正常,只要plc位變爲真,事件就會觸發 – 2013-02-21 21:12:56