2016-06-30 4 views
1

キャンセルボタンをクリックした後のマウスの動きが止まらないのはなぜですか?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); 
       } 
      } 
     } 
    } 
} 

答えて

2

あなただけの外側のwhileループでトークンの取り消しをチェックするので、それが停止しないと、あなたの内側のforループがために行きます数分。ただし、単純なifのチェックインや、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) && (!token.IsCancellationRequested); i++) 
{ 
    System.Threading.Thread.Sleep(2000); 
    SetCursorPos(i, 100); 
} 
関連する問題