Geçenlerde yerlerde bir dizi açıklanan görüldü ettik iptal desen kullanarak zaman uyumsuz WCF servis yöntemlerinin bir sürü reimplemented ettik. Elbette, mevcut görevler iptal edilemez, ancak bu daha sonraki bir sürümde ele alınacaktır. Benim durumumdaTask.Delay Worth İptal Ediliyor mu? Bir başlamış görev ve Task.Delay üzerinde <code>Task.WhenAny</code> bekliyor -
, Task.Delay
varsayılan süresi bir hizmet ayarı tarafından yönetilir. Vakaların ezici bir çoğunluğunda, sonuç, umulan görevin gerekli zaman diliminde tamamlanmış olmasıdır. Ayar genellikle cömert yapılır.
çoğu (hepsi değil) gördüğüm örnekler Task.Delay
iptal etmek zahmet etmeyin. Bu kadar ucuz mu, endişelenmeye değmez mi? İptalin bir istisna oluşturduğunu biliyorum. Gecikmeyi iptal edersem, istisnayı ele almalı mıyım? şu şekilde görünecektir gecikme yaratır
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);
}
}
}
... ve yöntem:
private Task GetDelay(CancellationToken token)
{
return Task
.Delay(Properties.Settings.Default.ServiceMethodTimeout, token)
.ContinueWith(_ => { }, TaskContinuationOptions.ExecuteSynchronously);
}
Eğer burada
içinden aradığınız tüm servis yöntemlerinin, yaptığınız yöntemidir Gecikmeyi iptal etmiyorum, kaynaklara gerekenden daha uzun süre tutuyorum mu? Özellikle, WCF'nin hizmet yöntemlerini çağırmak için döndüğü örneklerden endişeleniyorum. Hizmetin yapılandırıldığı eşzamanlılık parametrelerini keseceklerinden endişeleniyorum. Zaman aşımı ayarı oldukça kaba. İptal etmemek israf gibi görünüyor, ama bu benim için her şey çok yeni.İptal, istisnalar içerdiğinden ve durumu bildirmek için istisnalar kullanmama konusunda eğitildiğimden beri, bu, kendimi tam olarak anlamadığım korkunç bir anti-örüntüye boyadığım gibi hissettiriyor. Belki de Task.Delay
benim için doğru seçim değildir. , gibi hissettirdiğimden, yapmam gerekenden daha karmaşık hale getirdim. Durumda dökülen herhangi bir ışık en çok takdir edilecektir.
@AlexeiLevenkov Neden o yaptığı şey varsayıyorsun? – i3arnon
'Task.Delay' öğesine iletilen simgenin doğru şekilde iptal edilmesi, zamanlayıcıyı kullanır. Düzenli görevlerin iptal edilmeyi kontrol etmesini sağladığımı varsaydım, bu durum böyle olmadı. –
@ i3arnon, teşekkürler. Evet - Çok uygulamak için bir model arıyorum. Bu soruya, daha önce cevaplarınızdan birindeki boş devamlılığı gördüğümüzü umuyordum. Zaman aşımına uğramış görevlere bu yaklaşım, _best practice_ değilse, _common proactice_ haline geliyor gibi görünüyor ve bu iyi, kötü ya da başka bir şey olduğunu düşünüyorsanız merak ediyorum. – Clay