C# 当用户界面忙时更改光标

C# 当用户界面忙时更改光标,c#,wpf,multithreading,C#,Wpf,Multithreading,我有这门课: public class CursorWait : IDisposable { private readonly CancellationTokenSource _tokenSource; public CursorWait(int showAfter) { _tokenSource = new CancellationTokenSource(); Task.Delay(showAfter, _tokenSource.Tok

我有这门课:

public class CursorWait : IDisposable
{
    private readonly CancellationTokenSource _tokenSource;

    public CursorWait(int showAfter)
    {
        _tokenSource = new CancellationTokenSource();
        Task.Delay(showAfter, _tokenSource.Token).ContinueWith(delegate(Task task)
        {
            if (!task.IsCanceled)
                Mouse.SetCursor(Cursors.Wait);
        });
    }

    public void Dispose()
    {
        _tokenSource.Cancel();
        Mouse.SetCursor(Cursors.Arrow);
    }
}
要这样使用它:

using (new CursorWait(showAfter: 500))
{
    DoSomethingMayBeHeavyOrNotInUI(); 
}
但是,由于Mouse.SetCursor依赖UI线程来更改它,因此它不起作用,而且由于它很忙,它永远不会更改,因此如何更改光标

注意:我知道我不应该阻塞UI线程,而应该只是更改窗口的属性ISITETSTVISIBLE。但我是这个项目的新手,我的团队就是这样做的,他们不会让我做的,因为项目快完成了

Application.Current.Dispatcher.Invoke(new Action(()=>
    {
        // your code
    }));


有关详细信息,请访问:

在设置鼠标光标后尝试添加此行

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));

当我说“Mouse.SetCursor依赖于UI线程”时,我的意思是我不会改变,因为UI线程很忙,执行调用不会让它变得不那么忙。我的理解是,这一行大致相当于基于表单的应用程序中的Application.DoEvents。它应该使UI线程处理任何挂起的窗口消息,包括更改光标。
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));