奇怪的错误。我有以下代码。
private void connectButton_Click(object sender, EventArgs e)
{
statusLabel.Text = "Connecting...";
statusLabel.ForeColor = Color.Green;
serverNameBox.Enabled = false;
databaseNameBox.Enabled = false;
connectButton.Enabled = false;
conn = new SqlConnection("server=" + serverNameBox.Text + ";Trusted_Connection=yes;database=" + databaseNameBox.Text + ";connection timeout=3");
try
{
conn.Open();
}
catch (Exception ex)
{
statusLabel.Text = "Connection Failed";
statusLabel.ForeColor = Color.DarkRed;
MessageBox.Show("Connection Failed. Error message below:\n" + ex.Message);
serverNameBox.Enabled = true;
databaseNameBox.Enabled = true;
connectButton.Enabled = true;
return;
}
statusLabel.Text = "Connected Successfully";
statusLabel.ForeColor = Color.DarkGreen;
serverNameBox.Enabled = true;
connectButton.Enabled = true;
conn.Close();
UpdateTraders();
UpdateTransactions();
}
“成功连接”和“连接失败”都可以正常工作。但是statusLabel永远不会更改为“正在连接”。 statusLabel.Text的默认值为“”(无)。
这里发生了什么?
答案 0 :(得分:0)
因为您在UI线程中进行文本更改并阻止它,因此会出现此问题。
您可以在更改标签文字后使用main':
sfml.cpp:(.text+0x12d): undefined reference to
解决此问题,但最好的方法是使用多线程。例如,您可以使用#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
类来实现此目的。
答案 1 :(得分:0)
如果您使用的是.Net 4.5或更高版本,则可以使用async
来保持用户界面畅通。
更改您的代码(请注意使用async
和await
关键字):
private async void connectButton_Click(object sender, EventArgs e)
{
statusLabel.Text = "Connecting...";
statusLabel.ForeColor = Color.Green;
serverNameBox.Enabled = false;
databaseNameBox.Enabled = false;
connectButton.Enabled = false;
conn = new SqlConnection("server=" + serverNameBox.Text + ";Trusted_Connection=yes;database=" + databaseNameBox.Text + ";connection timeout=3");
try
{
await conn.OpenAsync();
}
catch (Exception ex)
{
statusLabel.Text = "Connection Failed";
statusLabel.ForeColor = Color.DarkRed;
MessageBox.Show("Connection Failed. Error message below:\n" + ex.Message);
serverNameBox.Enabled = true;
databaseNameBox.Enabled = true;
connectButton.Enabled = true;
return;
}
statusLabel.Text = "Connected Successfully";
statusLabel.ForeColor = Color.DarkGreen;
serverNameBox.Enabled = true;
connectButton.Enabled = true;
conn.Close();
UpdateTraders(); // This might need the async treatment too
UpdateTransactions(); // This might need the async treatment too
}
但是,这可能还不够,具体取决于UpdateTraders()
和UpdateTransactions()
的作用。它们可能也需要异步,并且一些慢速调用转换为await ...
(假设它们支持它)。
答案 2 :(得分:0)
您可以在此代码中使用睡眠系统5秒,然后您可以为此工作加载图像:
System.Thread.Sleep(5000);
如果您使用的是Windows应用程序,请为此工作添加进度条。
答案 3 :(得分:-1)
实际上是&#34;连接......&#34;文本没有在UI线程中显示,但它确实工作正常。
因为在这种方法中,当执行第一行statusLabel.Text = "Connecting...";
之后,statuslabel文本将暂时更改但未在表单UI中显示,然后代码继续执行statuslabel的文本将当conn失败时被statusLabel.Text = "Connection Failed";
替换,或者当conn成功时被statusLabel.Text = "Connected Successfully";
替换。
所以在UI线程中,我们只看到文本更改为&#34; Connected Failed&#34;或者&#34;成功连接&#34;。
在 调试 模式下,在statusLabel.Text = "Connecting...";
行插入断点,按F6跳过,即可看到通过Debug Locals 窗口更改了statuslabel文本。