C# Can';不要更改当前光标
下面的代码测试我的连接。连接超时设置为30秒。我想将当前光标更改为waitcursor,但它不起作用 我的代码: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));
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;
}));
}