none
请问:怎样中断正在运行的方法? RRS feed

  • 问题

  • 首先在应用程序中定义了一个方法,形式如下所示:
    public async Task MethodName()
    {
        await MethodAsync();
        ............
    }
    这个方法的运行需要一定的时间,有些情况下需要提前终止运行。
    问题是:有什么办法能使这个方法还未运行完毕时就提前终止吗?谢谢!

    2013年1月25日 6:54

答案

  • //例如: private CancellationTokenSource cts = new CancellationTokenSource ();

    await MethodAsync().AsTask(cts.Token);

    你只要把你当MethodAsync()方法MethodAsync().AsTask(...);

    然后使用 CancellationTokenSource 来控制取消异步方法就好了

                cts .Cancel();
                cts .Dispose();

    详细用法请参考WindowsRuntimeSystemExtension静态类中的一些列重载的AsTask方法


    2013年1月25日 8:46
  • Hi,

    你的说法的话,可以使用await和CancellationToken的方法,await是防止阻塞UI线程,在你可以在UI线程中暂停MethodName这个线程的进行,我写了个例子你试一下:

    XAML:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBlock Name="text" />
            <Button Click="Button_Click_1" Content="Stop" />
        </Grid>

    public async void method()
            {
                try
                {
                    await MethodName(cts.Token);
                }
                catch(Exception ex)
                {
                    Debug.WriteLine(ex.Message.ToString());
                }
            }
    
            public async Task MethodName(CancellationToken token)
            {
               
                    for (int i = 0; i < 10000; ++i)
                    {
                        await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                         () =>
                         {
                             this.text.Text = i.ToString();
                         });
    
                        token.ThrowIfCancellationRequested();
                    }
               
            }
     private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                cts.Cancel();
                        }


    在MainPage()构造函数中直接调用method()即可。在界面中点击Stop计数会停下,并且在Output栏中输出Task cancel的信息。

    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.



    2013年1月29日 7:17
    版主

全部回复

  • //例如: private CancellationTokenSource cts = new CancellationTokenSource ();

    await MethodAsync().AsTask(cts.Token);

    你只要把你当MethodAsync()方法MethodAsync().AsTask(...);

    然后使用 CancellationTokenSource 来控制取消异步方法就好了

                cts .Cancel();
                cts .Dispose();

    详细用法请参考WindowsRuntimeSystemExtension静态类中的一些列重载的AsTask方法


    2013年1月25日 8:46
  • 那么有办法取消问题中的MethodName()方法吗?
    2013年1月25日 8:53
  • 对于MethodName()一个不是很好的方法就是你在你的方法中设置一个While循环然后通过Bool变量来控制;

    如果能有更好的方法,希望大家一起分享嗯!

    2013年1月25日 9:13
  • Hi,

    我不太清楚你取消问题中的MethodName()方法是指什么?是指取消运行过的代码还是别的意思?


    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月28日 12:03
    版主
  • 嗯,用“取消”这个词不太准确,我把问题再描述一下,请您帮助看一下。

    MethodName()方法是一个异步方法,它的执行需要时间。当MethodName()方法运行的时候,发生了一个其它事件(比如一个按钮的Click事件),这个时候我想终止MethodName()方法,虽然MethodName()方法还没有运行完毕。终止后MethodName()方法中运行过的代码不用取消,还未运行的代码则不用执行。

    谢谢您!




    • 已编辑 sikla 2013年1月29日 3:09
    2013年1月29日 3:02
  • Hi,

    你的说法的话,可以使用await和CancellationToken的方法,await是防止阻塞UI线程,在你可以在UI线程中暂停MethodName这个线程的进行,我写了个例子你试一下:

    XAML:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBlock Name="text" />
            <Button Click="Button_Click_1" Content="Stop" />
        </Grid>

    public async void method()
            {
                try
                {
                    await MethodName(cts.Token);
                }
                catch(Exception ex)
                {
                    Debug.WriteLine(ex.Message.ToString());
                }
            }
    
            public async Task MethodName(CancellationToken token)
            {
               
                    for (int i = 0; i < 10000; ++i)
                    {
                        await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                         () =>
                         {
                             this.text.Text = i.ToString();
                         });
    
                        token.ThrowIfCancellationRequested();
                    }
               
            }
     private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                cts.Cancel();
                        }


    在MainPage()构造函数中直接调用method()即可。在界面中点击Stop计数会停下,并且在Output栏中输出Task cancel的信息。

    Aaron
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.



    2013年1月29日 7:17
    版主
  • 非常感谢!
    2013年1月29日 9:27