2016-06-30 2 views
1

취소 버튼을 클릭 한 후 마우스가 움직이지 않는 이유는 무엇입니까?IAsyncResult cancelTokenSource

XAML :

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

코드 : 당신은 단지 외부 while 루프에서 토큰의 취소를 확인하고 내부 for 루프가 계속 있기 때문에

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

그것은 멈추지 않는다 몇 분 더. 그러나 간단한 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); 
} 
관련 문제