我有一个从 MySQL 数据库中提取数据并将其显示在控制台窗口中的界面。用于显示信息的代码使用 while 循环进行循环。
我遇到的问题是 MySQL 连接在每个循环上打开和关闭,这会导致显示信息的延迟。我曾尝试在循环之前打开一个连接,并在循环退出后关闭它,但我得到一个豁免,告诉我连接需要有效且打开。
所以循环将数据库中的数据添加到datalist
列表中,然后显示在控制台中。每个循环还会清除列表,因为服务器上的信息可能会因更新而改变。
我想摆脱的另一件事Thread.Sleep()
是它挂起程序(按照我知道的设计),但我不知道其他解决方案。
这是我的代码;
public void Loop()
{
public static string loopquery;
public static List<DataList> datalist;
var cki = new ConsoleKeyInfo();
do
{
DateTime time = DateTime.Now.AddSeconds(1);
while ((DateTime.Now < time))
{
Console.Clear();
Travel.data.Clear();
loopquery = "SELECT * FROM database)";
Travel();
Console.WriteLine("Hurray it's a loop!");
Console.WriteLine(datalist[0].id);
Console.WriteLine(datalist[0].name);
if (Console.KeyAvailable)
{
// Waits until the user presses a key, and puts it into our object key.
cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.UpArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.DownArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.LeftArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.RightArrow)
{
// Do Something
}
if (cki.Key == ConsoleKey.Escape)
{
break;
}
}
else
{
Thread.Sleep(1000);
}
}
} while (cki.Key != ConsoleKey.Escape);
}
public void Travel()
{
//Open a connection
databaseCon.Open();
//Create Command
var cmd = new MySqlCommand(Loop.loopquery, databaseCon);
//Create a data reader and Execute the command
var dataReader = cmd.ExecuteReader();
try
{
//Read the data and store them in the list
while (dataReader.Read())
{
var data= new DataList();
data.id = (dataReader.GetInt32(0));
data.name = (dataReader.GetString(1));
Loop.datalist.Add(data);
}
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex);
Console.ReadLine();
}
finally
{
if (dataReader != null)
{
//close Data Reader
dataReader.Close();
}
if (databaseCon != null)
{
//close Connection
databaseCon.Close();
}
}
}
有没有更有效的方法来做到这一点?我不想用数百个查询来敲击服务器,因为这个客户端将被许多人使用。