获取取消令牌或公开取消方法?
Take a cancellationtoken or expose a method for cancellation?
以下两个例子中哪一个是首选?
示例 1
public class Worker : IDisposable
{
private CancellationTokenSource tokenSource;
public string State { get; private set; }
public async Task StartWorkAsync()
{
tokenSource = new CancellationTokenSource();
this.State = "Working";
await Task.Delay(5000, tokenSource.Token);
}
public void StopWork()
{
this.tokenSource.Cancel();
this.State = "Stopped";
}
public void Dispose()
{
tokenSource?.Dispose();
}
}
示例 2
public class Worker
{
public string State { get; private set; }
public async Task StartWorkAsync(CancellationToken ctoken)
{
ctoken.ThrowIfCancellationRequested();
this.State = "Working";
try
{
await Task.Delay(5000, ctoken);
}
catch (AggregateException) when (ctoken.IsCancellationRequested)
{
this.State = "Stopped";
}
}
}
或者两者兼而有之?
但是,我认为通常的做法是使用异步方法获取取消令牌。
You should accept a CancellationToken
as an argument 并允许 OperationCanceledException
传播:
public async Task StartWorkAsync(CancellationToken ctoken)
{
ctoken.ThrowIfCancellationRequested();
this.State = "Working";
try
{
await Task.Delay(5000, ctoken);
}
catch (OperationCanceledException)
{
this.State = "Stopped";
throw;
}
}
以下两个例子中哪一个是首选?
示例 1
public class Worker : IDisposable
{
private CancellationTokenSource tokenSource;
public string State { get; private set; }
public async Task StartWorkAsync()
{
tokenSource = new CancellationTokenSource();
this.State = "Working";
await Task.Delay(5000, tokenSource.Token);
}
public void StopWork()
{
this.tokenSource.Cancel();
this.State = "Stopped";
}
public void Dispose()
{
tokenSource?.Dispose();
}
}
示例 2
public class Worker
{
public string State { get; private set; }
public async Task StartWorkAsync(CancellationToken ctoken)
{
ctoken.ThrowIfCancellationRequested();
this.State = "Working";
try
{
await Task.Delay(5000, ctoken);
}
catch (AggregateException) when (ctoken.IsCancellationRequested)
{
this.State = "Stopped";
}
}
}
或者两者兼而有之? 但是,我认为通常的做法是使用异步方法获取取消令牌。
You should accept a CancellationToken
as an argument 并允许 OperationCanceledException
传播:
public async Task StartWorkAsync(CancellationToken ctoken)
{
ctoken.ThrowIfCancellationRequested();
this.State = "Working";
try
{
await Task.Delay(5000, ctoken);
}
catch (OperationCanceledException)
{
this.State = "Stopped";
throw;
}
}