无法更改当前光标

时间:2013-12-30 16:52:22

标签: c# cursor wait

以下代码测试我的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;
}

我做错了什么?

4 个答案:

答案 0 :(得分:3)

以下代码错误(逻辑上)。

finally 
{             
    Cursor.Current = Cursors.Default;
}

这里发生的事情是

  1. 光标将更改为等待光标。
  2. 将启动线程,并立即将Cursor再次更改为默认值。(在线程完成之前)。
  3. 所以你应该在线程完成后放置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;