繁体   English   中英

IAsyncResult cancelTokenSource

[英]IAsyncResult cancelTokenSource

为什么单击取消按钮后鼠标移动不停止?

XAML:

<Button Height="20" Width="40" Click="Button_Click"></Button>

码:

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {

        WorkWithMouse WWM = new WorkWithMouse();

        public MainWindow()
        {
            InitializeComponent();
            WWM.MouveMouseAsync();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            WWM.AbortMouseMove();
        }
    }

    public class WorkWithMouse
    {
        CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

        [DllImport("User32.dll")]
        private static extern bool SetCursorPos(int X, int Y);

        public void AbortMouseMove()
        {
            cancelTokenSource.Cancel();
        }

        public void MouveMouseAsync()
        {
            Action<CancellationToken> task = new Action<CancellationToken>(MoveMouse);
            IAsyncResult result = task.BeginInvoke(cancelTokenSource.Token, null, null);
        }
        private void MoveMouse(CancellationToken token)
        {
            while (!token.IsCancellationRequested)
            {
                for (int i = 100; i < 500; i++)
                {
                    System.Threading.Thread.Sleep(2000);
                    SetCursorPos(i, 100);
                }
            }
        }
    }
}

它不会停止,因为您仅在外部while循环中检查令牌的取消, while内部for循环会继续运行几分钟。 但是,您可以if签入或for循环中添加一个简单的if

for (int i = 100; i < 500; i++)
{
    if (token.IsCancellationRequested) break;

    System.Threading.Thread.Sleep(2000);
    SetCursorPos(i, 100);
}

或内联:

for (int i = 100; (i < 500) && (!token.IsCancellationRequested); i++)
{
    System.Threading.Thread.Sleep(2000);
    SetCursorPos(i, 100);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM