none
Task.Delay(...) 지연시간 종료전에 강제 종료하기 RRS feed

  • 질문

  • 안녕하세요. 다람쥐이 입니다 ^^

    Task.Delay 비동기 시간지연 메서드를 사용하고 있는데

    지연시간이 끝나기 전에 강제로 종료 시키고 싶을 때 어떻게 해야하나요?

    두번째 파라미터가 CancellationToken 인데 이 파라미터를 통해 종료가 가능할 것 같은데 사용법을 잘 모르겠습니다

    답변 부탁 드립니다 좋은 하루 되세요 ~ ^^

    코드 조각 입니다

     private void abSlideShow_Click(object sender, RoutedEventArgs e)
     {
           if (abSlideShow.IsChecked.Value)
           {
                 itemFlipView.SelectedIndex = 0;
                 bottomAppBar.IsOpen = false;
                 SlideShowAsync();
            }
            else
            {
                 // 여기에 Task.Delay 를 강제 종료하는 코드를 넣고 싶습니다
            }
     }


    Cancellationtoken ct = new CancellationToken();

    private async void SlideShow()

    {

         for (int i = 1; i < this.group.Items.Count; i++)
         {
              await Task.Delay(10000, ct);
              itemFlipView.SelectedIndex = i;
         }  

    }


    • 편집됨 Squirrel Lee 2014년 3월 23일 일요일 오후 4:21
    2014년 3월 23일 일요일 오후 4:21

답변

  • 이 때는 CancellationToken을 직접 쓰는 것이 아니고,

    CancellationTokenSource의 Token 프로퍼티가 CancellationToken 타입이며, 이것을 Task.Delay의 파라미터로 활용합니다.

    코드로 짜보자면 대략 이렇게 되겠네요.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
    
    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            CancellationTokenSource cts;
    
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private void btnCancel_Click(object sender, RoutedEventArgs e)
            {
                if (cts != null)
                {
                    cts.Cancel();
                }
            }
    
            private async void btnSlideShow_Click(object sender, RoutedEventArgs e)
            {
                cts = new CancellationTokenSource();
    
                try
                {
                    await Task.Delay(10000, cts.Token);
                    tbText.Text = "end of test";
                }
                catch (Exception ex)
                {
                    tbText.Text = ex.Message;
                }            
            }
        }
    }



    2014년 3월 24일 월요일 오전 9:39

모든 응답

  • 이 때는 CancellationToken을 직접 쓰는 것이 아니고,

    CancellationTokenSource의 Token 프로퍼티가 CancellationToken 타입이며, 이것을 Task.Delay의 파라미터로 활용합니다.

    코드로 짜보자면 대략 이렇게 되겠네요.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
    
    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            CancellationTokenSource cts;
    
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            private void btnCancel_Click(object sender, RoutedEventArgs e)
            {
                if (cts != null)
                {
                    cts.Cancel();
                }
            }
    
            private async void btnSlideShow_Click(object sender, RoutedEventArgs e)
            {
                cts = new CancellationTokenSource();
    
                try
                {
                    await Task.Delay(10000, cts.Token);
                    tbText.Text = "end of test";
                }
                catch (Exception ex)
                {
                    tbText.Text = ex.Message;
                }            
            }
        }
    }



    2014년 3월 24일 월요일 오전 9:39
  • 답변 감사드립니다

    덕분에 쉽게 해결되었습니다 ^^

    2014년 3월 25일 화요일 오전 1:02