[英]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.