以下代码测试我的Connection。连接超时设置为30秒。我想将当前的Cursor更改为等待标记,但它不起作用。
我的代码:
private void pbConnectionTest_Click(object sender,EventArgs e) {
try {
Cursor.Current = Cursors.WaitCursor;
Thread thread = new Thread(new ThreadStart(TestConnection));
thread.Start();
} finally {
Cursor.Current = Cursors.Default;
}
我还尝试在函数TestConnection中处理Cursor。但它在那里不起作用。
这个例子没有问题:
Cursor.Current = Cursors.WaitCursor;
try
{
Thread.Sleep(5000); // wait for a while
}
finally
{
Cursor.Current = Cursors.Default;
}
我做错了什么?
答案 0 :(得分:3)
以下代码错误(逻辑上)。
finally
{
Cursor.Current = Cursors.Default;
}
这里发生的事情是
所以你应该在线程完成后放置follwing语句。
Cursor.Current = Cursors.Default;
这里你应该知道的是,调用thread.Start();
将立即返回。(不等待线程完成)
<强>解决方法1 强>
从finally
块中删除语句,并执行以下操作。
void TestConnection()
{
..............
..................
this.Invoke(new MethodInvoker(() =>
{
Cursor = Cursors.Default;
}));
}
答案 1 :(得分:2)
这是因为您的第一个示例会立即将光标更改回默认值。
由于您正在启动一个新线程,该线程将运行TestConnection代码。原始线程继续执行,最后块将光标更改回默认值。您需要等到线程完成后再更改光标 - 如果您可以在TestConnection方法结束时执行此操作,那么这将是最简单的方法。
但仅仅因为它最简单,它可能不是正确的解决方案。您可能希望分离关注点,将UI与连接测试分开。在这种情况下,您将需要一个事件,回调或类似的东西;在连接测试完成时通知您。
答案 2 :(得分:1)
看起来你的例子中没有暂停,因为它只是启动一个线程而不是等待该线程的执行返回。但是要强制使用光标,你可以使用OverrideCursor
http://msdn.microsoft.com/en-us/library/system.windows.input.mouse.overridecursor(v=vs.110).aspx,但就像我说的那样,除非你等待你的线程回来,否则它可能不会做任何事情。
try
{
Mouse.Overidecursor = Cursors.WaitCursor;
Thread thread = new Thread(new ThreadStart(TestConnection));
thread.Start();
}
finally
{
Mouse.Overidecursor = null;
}
如果您要等待完成,可以使用BackgroundWorker
并使用RunWorkerCompleted
事件将光标更改回默认光标。
答案 3 :(得分:0)
嗯,有一段时间过去了,当我发现自己处于同样的境地时。 我解决了它如下:
This.UseWaitCursor = true;