我正在尝试编写一个在两个系统之间传输数据的应用程序。此应用程序由用户使用,因此它是WinForm应用程序。当通过单击用户启动数据传输时,即使我在另一个线程中启动数据传输,GUI也会被冻结。我做错了什么但我无法弄清楚。这是我的简化代码....
我做错了什么?
// Button Click Event
private void btnStart_Click(object sender, EventArgs e)
{
StartThread();
}
// This starts the threaad.
public static void StartThread()
{
string msg = string.Empty;
int i = 0;
continue_ = true;
if (list != null)
{
while (continue_)
{
i++;
Thread.Sleep(5000);
Thread thrd1 = new System.Threading.Thread(() => Test());
thrd1.Start();
}
}
}
// This is a simplified code.
public static void Test()
{
string msg = string.Empty;
int i = 0;
continue_ = true;
while (continue_)
{
i++;
Thread.Sleep(5000);
FormMain.dal.ExecuteQuery("INSERT INTO A_TEST VALUES('"+i+"')",null,CommandType.Text,out msg);
}
}
答案 0 :(得分:2)
你的StartThread()方法包含一个Thread.Sleep(5000)......这是在你的按钮点击方法中发生的,因此使得UI线程处于睡眠状态。此外,看起来您在UI线程上有一个无限循环,因为continue_永远不会设置为false
我猜你在这里想要达到的目标,但这可能有所帮助:
public static void StartThread()
{
Thread thrd1 = new System.Threading.Thread(() => Test());
thrd1.Start();
}
答案 1 :(得分:0)
让我们看一下StartThread
中的这个块:
while (continue_)
{
i++;
Thread.Sleep(5000);
Thread thrd1 = new System.Threading.Thread(() => Test());
thrd1.Start();
}
continue_
上有依赖循环,但您永远不会将其更改为false
。所以你首先得到一个无限循环,这会导致GUI冻结。i
,但从不使用它,所以只需删除它即可。Thread.Sleep(5000);
。但是,如果您真的想等一段时间,可以使用an async delay。它将使GUI免费,以便GUI工作直到延迟完成。但为此,您必须将StartThread
声明为async
。答案 2 :(得分:-1)
在你的:
Thread.Sleep(5000);
您使用returnValue
然而,这仍然针对您的主线程。 我建议你删除这一行。
另外,为什么你从不使用变量'i'?