我创建了一个名为“ ETM”的程序。
用户界面如下: http://i67.tinypic.com/so3h21.jpg
此程序用于将有关当前货币汇率的数据发送到汇率表。 (表格图片:http://i66.tinypic.com/wjguaa.jpg)
这些表属于打印机,可以通过本地网络使用打印服务器进行访问。使用该程序的公司在全国范围内拥有约50张桌子(有关打印服务器的信息:https://www.tp-link.com/us/products/details/TL-PS110P.html)
程序有两种模式:“手动模式”和“自动模式”。
1)手动模式允许用户在文本框中输入汇率,然后按“发送数据”按钮,所有表中都会显示输入的汇率。
2)AUTO MODE每20秒就会从服务中获取货币汇率,并且如果汇率已更改,其逻辑与MANUAL MODE相同。
// Table object implementation
public class ExchangeTable : ITable {
public string TableName { get; set; }
public IPAddress IPAddress { get; set; }
public int Port { get; set; }
public IEnumerable<Currency> Currencies { get; set; }
public string LogMessage { get; set; }
}
// Currency object implemetation
public class Currency {
public object CurrencyName { get; set; }
public string BuyPrice { get; set; }
public string SellPrice { get; set; }
}
程序启动时,用户从“列表”复选框中检查表,然后使用MANUAL MODE的“ SEND DATA”按钮或AUTO MODE的“ START PROCESS”按钮 执行操作。
// data sending logic
public virtual void SendDataToTable(ITable table) {
if (table != null && table.Currencies != null) {
using (TcpClient client = new TcpClient()) {
try {
string dataToSend = GetPrintString(GetPrices(table));
client.Connect(table.IPAddress, table.Port);
if (client.Connected) {
byte[] buffer = Encoding.ASCII.GetBytes(dataToSend);
using (NetworkStream stream = client.GetStream()) {
stream.Write(buffer, 0, buffer.Length);
}
if (table is ExchangeTable)
((ExchangeTable)table).LogMessage = "SUCCESS";
}
}
catch (Exception ex) {
if (table is ExchangeTable)
((ExchangeTable)table).LogMessage = "FAILURE: " + ex.Message;
}
}
}
}
此后,一切正常。所有50个表显示正确的数据,但是经过一段时间(大约1小时或更长时间)后,5个表(总是相同的表)显示错误的符号,其余45个表仍然显示正确的数据。所有这50个表都是相同的。我不知道为什么只在5个表上而不是在所有表上都发生这种情况。您有解决该问题的想法吗? :(
答案 0 :(得分:0)
问题很可能发生在代码的另一部分,因为在已发布的代码中,表只是一个预定义的参数,已经包含CurrencyName对象。尝试发布在其中为每个表定义CurrencyName的代码。
但是,我不知道为什么CurrencyName是一个对象,而不是更具体的东西,例如字符串或枚举。在这种情况下,错误的符号错误可能会导致运行时错误,您会发现这很容易。