一个是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;
}
}
}
答案 0 :(得分:2)
首先,您需要在后台线程上运行邮件检查程序。请尝试使用BackgroundWorker
组件。
其次,使用Timer
启动温度更新,而不是暂停线程。
要结合这两个程序,我首先要改变现有的类,以便在发生重要事件时引发事件。例如,temp将每1秒引发一个事件,事件args将包含数据。
另一方面,邮件检查员只会在完成邮件检查后提出事件;也许只有当未读消息的数量与上次检查相比发生了变化时。
最后,创建一个新类,该类订阅每个现有程序中的事件,并在触发事件时写入串行端口。此类可以将最后报告的未读消息计数存储在私有字段中,并且每次都重复使用该消息,直到触发新事件来更新该值。