【发布时间】:2018-01-05 12:03:36
【问题描述】:
我有一个名为 Connect() 的函数,这个函数大约需要 2-3 秒,因为它使用了一些 api 请求。现在我想找到一种方法,让我的 UI 在启动此功能时不会冻结。
private void connectToolStripMenuItem_Click(object sender, EventArgs e)
{
Connect() // << this tooks a lot of time
}
我已经尝试用线程解决它
private void connectToolStripMenuItem_Click(object sender, EventArgs e)
{
new Thread(Connect).Start();
}
和一个后台工作人员
private void backgroundWorkerConnect_DoWork(object sender, DoWorkEventArgs e)
{
Connect();
}
但程序仍然冻结。
private void Connect()
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(Connect));
}
else
{
if (!connected)
{
connected = true;
verbindenToolStripMenuItem.Enabled = false;
trennenToolStripMenuItem.Enabled = true;
InfoStripStatus.Text = "Status: Connected";
irc.joinRoom(channel, BotConnectingMessage);
chatThread = new Thread(getMessage);
chatThread.Start();
loadLoyalty();
updateTimer = new System.Threading.Timer(timerViewer, null, 0, 60000);
}
}
}
也许我只是做错了什么,希望有人能帮助我。
【问题讨论】:
-
启动一个新线程不应该冻结 UI,因为它有自己的线程
-
Connect();方法不依赖或调用 UI 线程上的任何内容?如果将Connect()中的任何内容替换为System.Threading.Thread.Sleep(3000);,它仍然会冻结用户界面吗? (使用最后两个选项进行测试) -
好吧,我尝试用 sleep(3000) 替换 Connect() 内容,现在不再冻结。但我不明白为什么,因为在 Connect() 功能中没有什么需要那么长时间。我将在顶部添加 Connect() 的内容:)
-
好的,你能给我举个例子吗...PLEEAAASSEEE :D
-
这是一个很好的示例,介绍如何使用后台工作程序以及如何在执行长时间操作时保持 UI 响应。 msdn.microsoft.com/fr-fr/library/cc221403(v=vs.95).aspx 如果您需要从后台线程更新 UI 控件,您应该使用它们的“Invoke”方法更新控件。
标签: c# function methods freeze