C# IAsyncResult取消标记源

C# IAsyncResult取消标记源,c#,wpf,asynchronous,C#,Wpf,Asynchronous,为什么单击“取消”按钮后的鼠标移动没有停止 Xaml: 代码: 命名空间WpfApplication2 { 公共部分类主窗口:窗口 { WorkWithMouse WWM=新建WorkWithMouse(); 公共主窗口() { 初始化组件(); WWM.MouveMouseAsync(); } 私有无效按钮\u单击(对象发送者,路由目标e) { WWM.AbortMouseMove(); } } 公共类鼠标操作 { CancellationTokenSource cancelTokenSo

为什么单击“取消”按钮后的鼠标移动没有停止

Xaml:


代码:

命名空间WpfApplication2
{
公共部分类主窗口:窗口
{
WorkWithMouse WWM=新建WorkWithMouse();
公共主窗口()
{
初始化组件();
WWM.MouveMouseAsync();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
WWM.AbortMouseMove();
}
}
公共类鼠标操作
{
CancellationTokenSource cancelTokenSource=新的CancellationTokenSource();
[DllImport(“User32.dll”)]
私有静态外部bool SetCursorPos(intx,inty);
public void AbortMouseMove()
{
cancelTokenSource.Cancel();
}
public void MouveMouseAsync()
{
动作任务=新动作(移动鼠标);
IAsyncResult结果=task.BeginInvoke(cancelTokenSource.Token,null,null);
}
私有void MoveMouse(CancellationToken令牌)
{
而(!token.IsCancellationRequested)
{
对于(int i=100;i<500;i++)
{
系统线程线程睡眠(2000);
SetCursorPos(i,100);
}
}
}
}
}

它不会停止,因为您只检查外部
循环中的令牌取消情况,而内部
for
循环会继续几分钟。但是,如果签入,您可以添加一个简单的
,或者添加到
for
循环中

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;i++)
{
如果(token.IsCancellationRequested)中断;
系统线程线程睡眠(2000);
SetCursorPos(i,100);
}
或内联:

for (int i = 100; (i < 500) && (!token.IsCancellationRequested); i++)
{
    System.Threading.Thread.Sleep(2000);
    SetCursorPos(i, 100);
}
for(inti=100;(i<500)和(!token.iscancellationrequest);i++)
{
系统线程线程睡眠(2000);
SetCursorPos(i,100);
}
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);
}