Cla*_*lay 8 .net c# wcf task-parallel-library async-await
我最近使用我在很多地方描述的取消模式重新实现了一大堆异步WCF服务方法 - 在等待Task.WhenAny启动任务和Task.Delay的地方.当然,现有任务不可取消,但希望在以后的版本中解决.
在我的情况下,默认持续时间Task.Delay由服务设置控制.在绝大多数情况下,结果是希望的任务在必要的时间内完成.环境通常很慷慨.
大多数(但不是全部)我见过的例子都没有打扰取消Task.Delay.它是如此便宜,不值得担心吗?我知道取消会引发异常.如果我取消延迟,我应该处理异常吗?
这是我所做的所有服务方法调用的方法:
private async Task<T> GetOrTimeout<T>( Task<T> task, [CallerMemberName] string caller = "" )
{
using ( var cts = new CancellationTokenSource( ) )
{
try
{
var timeout = GetDelay( cts.Token );
var first = await Task.WhenAny( task, timeout );
if ( first == timeout ) throw new TimeoutException( Properties.Resources.TimeoutOccurredInService.Fmt( caller ) );
cts.Cancel( ); //--> haven't been doing this. Should I?
return await task;
}
catch ( Exception ex )
{
throw LoggedFaultException( ex, caller );
}
}
}
Run Code Online (Sandbox Code Playgroud)
...并且创建延迟的方法如下所示:
private Task GetDelay( CancellationToken token )
{
return Task
.Delay( Properties.Settings.Default.ServiceMethodTimeout, token )
.ContinueWith( _ => { }, TaskContinuationOptions.ExecuteSynchronously );
}
Run Code Online (Sandbox Code Playgroud)
如果我不取消延迟,我是否持有超过必要的资源?特别是,我担心WCF旋转调用服务方法的实例.我担心他们会切入服务配置的并发参数.超时设置非常粗糙.不取消似乎很浪费,但这对我来说都是很新的东西.
由于取消涉及异常,并且因为我接受过培训,不使用例外来表达状态,所以我觉得自己已经把自己画成了一些我不完全理解的可怕的反模式.也许Task.Delay对我来说不是正确的选择.这感觉就像我做了它比我要更复杂.任何有关这种情况的灯光都会受到赞赏.
首先,整个问题在性能方面可能可以忽略不计,只有在真实环境中测试后才应考虑其他问题。
但是,如果我们深入研究,Task.Delay则会创建一个在特定时间间隔后完成的任务。它通过创建一个新的System.Threading.Timer(实现IDisposable)来实现,在间隔之后使用ThreadPool线程完成承诺任务。
如果您使用Task.Delay“很多”,您可能会在它们有用后很长时间内有大量浪费的资源。如果您还Task.Delay使用捕获任何引用的委托向任务添加任何延续,它们也会无缘无故地徘徊。
所以是的,取消任务而不是让它用完更安全,尽管可能不会太多。
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |