14 ŞUBAT 2011, PAZARTESİ
Bir Görevin başlangıç gecikme için doğru yolu
Başlamadan önce x ms başlatmak ve iptal etmek için bir görev (veya görev başında) planlamak istiyorum.
İlk girişimi gibi bir şey olur
var _cancelationTokenSource = new CancellationTokenSource();
var token = _cancelationTokenSource.Token;
Task.Factory.StartNew(() =>
{
token.ThrowIfCancellationRequested();
Thread.Sleep(100);
token.ThrowIfCancellationRequested();
}).ContinueWith(t =>
{
token.ThrowIfCancellationRequested();
DoWork();
token.ThrowIfCancellationRequested();
}, token);
Ama bu süre boyunca iptal edilmiş olabilir uykuda iken bir iplik kadar kullanmak gibi daha iyi bir yolu olmalı gibi hissediyorum.
Diğer seçeneklerim ne?
CEVAP
30 Ocak 2012, PAZARTESİ
Damien_The_Unbeliever mentioned, zaman Uyumsuz CTP Task.Delay
içerir gibi. Neyse ki, Reflektör
public static class TaskEx
{
static readonly Task _sPreCompletedTask = GetCompletedTask();
static readonly Task _sPreCanceledTask = GetPreCanceledTask();
public static Task Delay(int dueTimeMs, CancellationToken cancellationToken)
{
if (dueTimeMs < -1)
throw new ArgumentOutOfRangeException("dueTimeMs", "Invalid due time");
if (cancellationToken.IsCancellationRequested)
return _sPreCanceledTask;
if (dueTimeMs == 0)
return _sPreCompletedTask;
var tcs = new TaskCompletionSource<object>();
var ctr = new CancellationTokenRegistration();
var timer = new Timer(delegate(object self)
{
ctr.Dispose();
((Timer)self).Dispose();
tcs.TrySetResult(null);
});
if (cancellationToken.CanBeCanceled)
ctr = cancellationToken.Register(delegate
{
timer.Dispose();
tcs.TrySetCanceled();
});
timer.Change(dueTimeMs, -1);
return tcs.Task;
}
private static Task GetPreCanceledTask()
{
var source = new TaskCompletionSource<object>();
source.TrySetCanceled();
return source.Task;
}
private static Task GetCompletedTask()
{
var source = new TaskCompletionSource<object>();
source.TrySetResult(null);
return source.Task;
}
}
Bunu Paylaş:
Modern Python özel istisnalar bildirme...
Tek örnek bir uygulama oluşturmak için...
Bir ağaca doğru düz bir masa ayrıştırm...
Dosya için satır yazmak için doğru yol...
Ne'In AngularJS?denetleyicileri a...