2011-09-10 7 views
1

私は2つのクラスを持っているので、それぞれ異なる間隔でタイマーを設定します。 1つは2秒ごとに消え、もう1つは2分ごとに消えます。タイマーの下でコードが実行されるたびに、コードが生成するデータ文字列でイベントを発生させます。私は他のクラスからイベントargsを購読し、イベントが発生するたびにコンソールに書き込むようなことをする別のクラスを作りたいと思います。 1クラスは2分ごとに起動するだけなので、このクラスはプライベートフィールドに最後のイベントを格納し、新しいイベントが発生してその値を更新するまで毎回そのイベントを再利用できます。タイマーでイベントを発生させる方法は?

だから、どのように私は、データの文字列でイベントを発生させないか?、どのようにこれらのイベントをサブスクライブし、画面か何かに印刷するには?

が、これは私がこれまで持っているものです。

public class Output 
    { 
     public static void Main() 
     { 
      //do something with raised events here 
     } 
    } 


    //FIRST TIMER 
    public partial class FormWithTimer : EventArgs 
    { 
     Timer timer = new Timer(); 

     public FormWithTimer() 
     { 
      timer = new System.Timers.Timer(200000); 

      timer.Elapsed += new ElapsedEventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called 
      timer.Interval = (200000);    
      timer.Enabled = true;      // Enable the timer 
      timer.Start();        // Start the timer 
     } 

     //Runs this code every 2 minutes, for now i just have it running the method   
     //(CheckMail();) of the code but i can easily modify it so it runs the code directly. 
     void timer_Tick(object sender, EventArgs e) 
     { 
      CheckMail();    
     } 

     public static string CheckMail() 
     { 
      string result = "0"; 

      try 
      { 
       var url = @"https://gmail.google.com/gmail/feed/atom"; 
       var USER = "usr"; 
       var PASS = "pss"; 

       var encoded = TextToBase64(USER + ":" + PASS); 

       var myWebRequest = HttpWebRequest.Create(url); 
       myWebRequest.Method = "POST"; 
       myWebRequest.ContentLength = 0; 
       myWebRequest.Headers.Add("Authorization", "Basic " + encoded); 

       var response = myWebRequest.GetResponse(); 
       var stream = response.GetResponseStream(); 

       XmlReader reader = XmlReader.Create(stream); 
       System.Text.StringBuilder gml = new System.Text.StringBuilder(); 
       while (reader.Read()) 
        if (reader.NodeType == XmlNodeType.Element) 
         if (reader.Name == "fullcount") 
         { 
          gml.Append(reader.ReadElementContentAsString()).Append(","); 
         } 
       Console.WriteLine(gml.ToString()); 
      // I want to raise the string gml in an event 
      } 
      catch (Exception ee) { Console.WriteLine(ee.Message); } 
      return result; 
     } 

     public static string TextToBase64(string sAscii) 
     { 
      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
      byte[] bytes = encoding.GetBytes(sAscii); 
      return System.Convert.ToBase64String(bytes, 0, bytes.Length); 
     } 
    } 


    //SECOND TIMER 
    public partial class FormWithTimer2 : EventArgs 
    { 
     Timer timer = new Timer(); 

     public FormWithTimer2() 
     { 
      timer = new System.Timers.Timer(2000); 

      timer.Elapsed += new ElapsedEventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called 
      timer.Interval = (2000);    // Timer will tick evert 10 seconds 
      timer.Enabled = true;      // Enable the timer 
      timer.Start();        // Start the timer 
     } 

     //Runs this code every 2 seconds 
     void timer_Tick(object sender, EventArgs e) 
     { 
      using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
     { 
      using (var readerz = file.CreateViewAccessor(0, 0)) 
      { 
       var bytes = new byte[194]; 
       var encoding = Encoding.ASCII; 
       readerz.ReadArray<byte>(0, bytes, 0, bytes.Length); 

       //File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes)); 

       StringReader stringz = new StringReader(encoding.GetString(bytes)); 

       var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
       using (var reader = XmlReader.Create(stringz, readerSettings)) 
       { 
        System.Text.StringBuilder aida = new System.Text.StringBuilder(); 
        while (reader.Read()) 
        { 
         using (var fragmentReader = reader.ReadSubtree()) 
         { 
          if (fragmentReader.Read()) 
          { 
           reader.ReadToFollowing("value"); 
           //Console.WriteLine(reader.ReadElementContentAsString() + ","); 
           aida.Append(reader.ReadElementContentAsString()).Append(","); 
          } 
         } 
        } 
        Console.WriteLine(aida.ToString()); 
      // I want to raise the string aida in an event 
       } 
      } 
     } 
    } 

答えて

1

まず、私は、イベントに関連するロジックを処理している基底クラスになるだろう。

/// <summary> 
/// Inherit from this class and you will get an event that people can subsribe 
/// to plus an easy way to raise that event. 
/// </summary> 
public abstract class BaseClassThatCanRaiseEvent 
{ 
    /// <summary> 
    /// This is a custom EventArgs class that exposes a string value 
    /// </summary> 
    public class StringEventArgs : EventArgs 
    { 
     public StringEventArgs(string value) 
     { 
      Value = value; 
     } 

     public string Value { get; private set; } 
    } 

    //The event itself that people can subscribe to 
    public event EventHandler<StringEventArgs> NewStringAvailable; 

    /// <summary> 
    /// Helper method that raises the event with the given string 
    /// </summary> 
    protected void RaiseEvent(string value) 
    { 
     var e = NewStringAvailable; 
     if(e != null) 
      e(this, new StringEventArgs(value)); 
    } 
} 

は、そのクラスは、文字列値とイベントを発生させるためのヘルパーメソッドを公開するカスタムのEventArgsクラスを宣言します。ここでは一例です。

public static void Main() 
{ 
    var timer1 = new FormWithTimer(); 
    var timer2 = new FormWithTimer2(); 

    timer1.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable); 

    //Same for timer2 
} 

static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e) 
{ 
    var theString = e.Value; 

    //To something with 'theString' that came from timer 1 
    Console.WriteLine("Just got: " + theString); 
} 
:あなたは.NETで他のイベントと同様に、これらのイベントを購読することができます

RaiseEvent(aida.ToString()); 

:あなたは、そのクラスを継承するためにあなたのタイマーを更新したら、あなたのような何かをすることができます

関連する問題