Rot*_*eel 5 c# task task-parallel-library
我看到CancellationToken并且CancellationTokenSource都有IsCancellationRequestedgetter方法.大多数示例都传递CancellationToken给在内部执行的方法Task.它通过使用任何这些来看我,电话可以返回.如果我使用IsCancellationRequested的CancellationTokenSource,这将是一个问题吗?ThrowIfCancellationRequested如果有取消请求,我应该抛出异常(通过使用)或只是从方法返回,如下面的代码所示?
class Program
{
//If CancellationToken is passed then it behaves in same way?
public static int TaskMethod(CancellationTokenSource tokenSource)
{
int tick = 0;
while (!tokenSource.IsCancellationRequested)
{
Console.Write('*');
Thread.Sleep(500);
tick++;
//token.Token.ThrowIfCancellationRequested();
}
//Should I just return or use ThrowIfCancellationRequested?
return tick;
}
public static void Main()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
Task<int> task = Task.Factory.StartNew<int>(() => TaskMethod(tokenSource));
Console.WriteLine("Press enter to stop the task");
Console.ReadLine();
tokenSource.Cancel();
Console.WriteLine("{0}", task.Result);
}
}
Run Code Online (Sandbox Code Playgroud)
CancellationTokenSource持有和控制CancellationToken实例。任务方法应该使用取消令牌但不修改它。如果传递CancellationTokenSource给一个方法,该方法将完全控制取消令牌。所以该方法应该CancellationToken作为一个参数。
取消请求后方法的行为取决于您。如果任务TaskCanceledException已被取消令牌终止,则没有规定任务应处于取消状态 (throw )。
在我看来,CancellationTokenSource用于启动取消(例如,通过另一个/父线程)。 CancellationToken.Token是关联的CancellationToken,您将传递给类似 TaskFactory.StartNew() 的东西,如 MSDN 所说:
CancellationTokenSource.IsCancellationRequested属性指示是否已请求取消此令牌源,例如由于调用其 Cancel 方法。
然后Task将监视CancellationToken.IsCancellationRequested以确定何时关闭。
对于属性CancellationToken.IsCancellationRequested MSDN 说:
获取是否已请求取消此令牌。
综上所述,我想说的CancellationTokenSource.IsCancellationRequested是用来关联CancellationToken的TaskFactory.StartNew()。并且CancellationToken.IsCancellationRequested用于定义是否已请求取消该令牌。此外,和IntelliSense具有相同的定义。CancellationTokenSource.Token.IsCancellationRequestedCancellationToken.IsCancellationRequested
| 归档时间: |
|
| 查看次数: |
3910 次 |
| 最近记录: |