如何合并两个相似但独立程序的C#代码?

时间:2011-09-06 03:30:19

标签: c# serial-port

好的,所以我有两个程序。最后的代码。

一个是gmail通知程序,通过串行输出未读邮件的数量,如:<02,>等。

然后我有一个程序获取系统(pc)temps并将它们输出到串口也像:<30,42,50,>

它们都以不同的时间间隔输出相同的数据和相同的格式(<XX,>)(每次都有不同的值)。因此邮件每5分钟检查一次邮件,然后输出连续邮件的数量。但临时程序以1秒的速度以更快的速度输出数据。

我一直试图将两个程序合并为一个,因此它输出如:<02,30,42,50,>并且它每秒发送一次以便临时更新。因此最后三组挖掘每秒都会改变,但第一组不会每5分钟改变一次,但02仍然包含在输出中,因为它(输出)每次都需要相同的长度/组织等。

所以你们怎么想?最好的方法是什么?

我试图添加除static void Main之外的所有GMAIL代码(所有主要在gmail程序中执行的操作是调用get mail并将数据写入串行)到TEMPS程序,然后调用getmail {{1}其中temps程序写入串行(在新的组合代码中),但是停止将数据写入串行,以便它可以检查邮件,这有点慢,所以它deosnt写整个Unreadz = CheckMail();直到邮件完成检查。我的尝试:

<02,30,42,50,>

感谢。

GMAIL:

reader.ReadToFollowing("value");
port.Write(reader.ReadElementContentAsString() + ",");
Unreadz = CheckMail();
if (Convert.ToInt32(Unreadz) < 10) port.Write("0" + Unreadz + ",");
else port.Write("" + Unreadz + ",");

TEMPS:

namespace GmailNotifier
{
    class Gmail
    {
        public static void Main(string[] args)
        {
            try 
            {
               SerialPort port = new SerialPort( "COM2", 9600, Parity.None, 8, StopBits.One );
               port.Open();

                string Unreadz = "0";
                while ( true )
                {
                    Unreadz = CheckMail();

                    port.Write("<");

                    Console.WriteLine("Unread Mails: " + Unreadz);
                    if (Convert.ToInt32(Unreadz) < 10) port.Write("0" + Unreadz + ",");
                    else port.Write("" + Unreadz + ",");

                    port.Write(">");

                    System.Threading.Thread.Sleep(1000);
                }
            } catch ( Exception ee ) { Console.WriteLine( ee.Message ); }

        }

        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 );
        }

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

            try 
            {
                var url = @"hsttps://gmail.google.com/gmail/feed/atom";
                var USER = <uname>;
                var PASS = <password>;

                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 );
                while ( reader.Read())
                    if ( reader.NodeType == XmlNodeType.Element )
                        if ( reader.Name == "fullcount" ) 
                        {
                            result = reader.ReadElementContentAsString();
                            return result;
                        }
            } catch ( Exception ee ) { Console.WriteLine( ee.Message ); }
              return result;
        }

    }
}

1 个答案:

答案 0 :(得分:2)

首先,您需要在后台线程上运行邮件检查程序。请尝试使用BackgroundWorker组件。

其次,使用Timer启动温度更新,而不是暂停线程。

要结合这两个程序,我首先要改变现有的类,以便在发生重要事件时引发事件。例如,temp将每1秒引发一个事件,事件args将包含数据。

另一方面,邮件检查员只会在完成邮件检查后提出事件;也许只有当未读消息的数量与上次检查相比发生了变化时。

最后,创建一个新类,该类订阅每个现有程序中的事件,并在触发事件时写入串行端口。此类可以将最后报告的未读消息计数存储在私有字段中,并且每次都重复使用该消息,直到触发新事件来更新该值。