首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用CancellationToken属性?

如何使用CancellationToken属性?
EN

Stack Overflow用户
提问于 2013-02-25 21:15:14
回答 1查看 225.6K关注 0票数 140

与前面的代码for class RulyCanceler相比,我希望使用CancellationTokenSource来运行代码。

如何像Cancellation Tokens中提到的那样使用它,即不抛出/捕获异常?我可以使用IsCancellationRequested属性吗?

我尝试这样使用它:

代码语言:javascript
复制
cancelToken.ThrowIfCancellationRequested();

代码语言:javascript
复制
try
{
  new Thread(() => Work(cancelSource.Token)).Start();
}
catch (OperationCanceledException)
{
  Console.WriteLine("Canceled!");
}

但这在Work(CancellationToken cancelToken)方法中的cancelToken.ThrowIfCancellationRequested();上产生了一个运行时错误:

代码语言:javascript
复制
System.OperationCanceledException was unhandled
  Message=The operation was canceled.
  Source=mscorlib
  StackTrace:
       at System.Threading.CancellationToken.ThrowIfCancellationRequested()
       at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33
       at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

我成功运行的代码捕获了新线程中的OperationCanceledException:

代码语言:javascript
复制
using System;
using System.Threading;
namespace _7CancellationTokens
{
  internal class Token
  {
    private static void Main()
    {
      var cancelSource = new CancellationTokenSource();
      new Thread(() =>
      {
         try
         {
           Work(cancelSource.Token); //).Start();
         }
         catch (OperationCanceledException)
         {
            Console.WriteLine("Canceled!");
         }
         }).Start();

      Thread.Sleep(1000);
      cancelSource.Cancel(); // Safely cancel worker.
      Console.ReadLine();
    }
    private static void Work(CancellationToken cancelToken)
    {
      while (true)
      {
        Console.Write("345");
        cancelToken.ThrowIfCancellationRequested();
      }
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2017-07-24 09:37:09

你可以创建一个带有取消令牌的任务,当你应用转到后台时,你可以取消这个令牌。

您可以在PCL https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/app-lifecycle中执行此操作

代码语言:javascript
复制
var cancelToken = new CancellationTokenSource();
Task.Factory.StartNew(async () => {
    await Task.Delay(10000);
    // call web API
}, cancelToken.Token);

//this stops the Task:
cancelToken.Cancel(false);

另一种解决方案是Xamarin.Forms中的用户定时器,当应用程序转到后台https://xamarinhelp.com/xamarin-forms-timer/时停止定时器

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15067865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档