下面的代码测试我的连接。连接超时设置为30秒。我想将当前游标更改为等待游标,但它不起作用。
我的代码:
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.Current = Cursors.WaitCursor;
try
{
Thread.Sleep(5000); // wait for a while
}
finally
{
Cursor.Current = Cursors.Default;
}我做错了什么?
发布于 2013-12-30 17:19:24
下面的代码(逻辑上)是错误的。
finally
{
Cursor.Current = Cursors.Default;
}这里发生的是
因此,您应该在线程完成后放置follwing语句。
Cursor.Current = Cursors.Default;这里您应该知道的是,调用thread.Start();将立即返回。(不等待线程完成)
Solution1从finally块删除语句,并按以下方式执行。
void TestConnection()
{
..............
..................
this.Invoke(new MethodInvoker(() =>
{
Cursor = Cursors.Default;
}));
}发布于 2013-12-30 16:56:24
这是因为您的第一个示例将光标更改为默认。
由于您正在启动一个新线程,该线程将运行TestConnection代码。原始线程继续其执行,最后阻止将游标更改为默认值。您需要等到线程完成后再更改游标返回--如果您可以在TestConnection方法的末尾执行它,这将是最简单的方法。
但仅仅因为它是最简单的,它可能不是正确的解决办法。您可能需要分离关注点,将UI与连接测试分开。在这种情况下,您将需要一个事件、回调或类似的事件;在连接测试完成时通知您。
发布于 2013-12-30 16:59:17
您的示例中似乎没有停顿,因为它只是启动一个线程,而不是等待该线程的执行返回。但是要强制使用游标,可以使用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事件将光标更改为默认游标。
https://stackoverflow.com/questions/20843871
复制相似问题