Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';不要更改当前光标_C#_Cursor_Wait - Fatal编程技术网

C# Can';不要更改当前光标

C# Can';不要更改当前光标,c#,cursor,wait,C#,Cursor,Wait,下面的代码测试我的连接。连接超时设置为30秒。我想将当前光标更改为waitcursor,但它不起作用 我的代码: private void pbConnectionTest_Click(object sender,EventArgs e) { try { Cursor.Current = Cursors.WaitCursor; Thread thread = new Thread(new ThreadStart(TestConnection));

下面的代码测试我的连接。连接超时设置为30秒。我想将当前光标更改为waitcursor,但它不起作用

我的代码:

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;
}

我做错了什么?

这是因为第一个示例立即将光标更改回默认值

由于您正在启动一个新线程,该线程将运行TestConnection代码。原始线程继续执行,其中finally block将光标更改回默认值。您需要等到线程完成后再更改光标-如果可以在TestConnection方法的末尾执行此操作,那么这将是最简单的方法


但仅仅因为它是最简单的,它可能不是正确的解决方案。您可能希望将关注点分离,将UI与连接测试分离。在这种情况下,您将需要一个事件、回调或类似事件;当连接测试完成时通知您。

在您的示例中似乎没有暂停,因为它只是启动一个线程,而不是等待该线程的执行返回。但要强制使用游标,可以使用
覆盖器或
,但正如我所说的,除非等待线程返回,否则这可能不会起任何作用

try 
{
    Mouse.Overidecursor = Cursors.WaitCursor;
    Thread thread = new Thread(new ThreadStart(TestConnection));
    thread.Start();
} 
finally 
{
    Mouse.Overidecursor = null;
}

如果要等待踏板完成,可以使用事件将光标更改回默认光标。

以下代码错误(逻辑上)

这里发生的是

  • 游标将更改为等待游标
  • 线程将被启动,并立即将光标再次更改为默认值。(在线程完成之前)
  • 所以,您应该在线程完成后放置以下语句

            Cursor.Current = Cursors.Default;
    
    这里您应该知道的是,调用
    thread.Start()将立即返回。(不等待线程完成)

    解决方案1
    finally
    块中删除语句,并执行以下操作

    void TestConnection()
    {
        ..............
        ..................
    
    
       this.Invoke(new MethodInvoker(() =>
       {
            Cursor = Cursors.Default;
       }));   
    }
    

    好吧,一段时间过去了,当我发现自己也处于同样的境地。 我的解决办法如下:

    This.UseWaitCursor=true


    这是winforms还是wpf应用程序?如果是Thread.Sleep(anyInteger),则在测试连接或计时器的代码中是否使用Thread.Sleep();anyInteger以毫秒为单位计数
    void TestConnection()
    {
        ..............
        ..................
    
    
       this.Invoke(new MethodInvoker(() =>
       {
            Cursor = Cursors.Default;
       }));   
    }