c# - .NET 4.0 में टाइमआउट या रद्दीकरण तक "नींद" कैसे करें




.net-4.0 sleep (3)

अब तक मैंने पाया सबसे अच्छा समाधान है:

void MyFunc(CancellationToken ct)
{
  //...
  var timedOut = WaitHandle.WaitAny(new[] { ct.WaitHandle }, TimeSpan.FromMilliseconds(2000)) == WaitHandle.WaitTimeout;
  var cancelled = ! timedOut;
}

अद्यतन करें:

अब तक का सबसे अच्छा समाधान स्वीकृत उत्तर है ।

एक निश्चित समय पर सोने का सबसे अच्छा तरीका क्या है, लेकिन एक IsCancellationRequested से IsCancellationRequested जा सकता है?

मैं एक समाधान की तलाश कर रहा हूं जो .NET 4.0 में काम करता है।

मैं लिखना चाहूंगा

void MyFunc (CancellationToken ct)
{
   //... 
   // simulate some long lasting operation that should be cancelable 
   Thread.Sleep(TimeSpan.FromMilliseconds(10000), ct); 
}

मैंने अभी इसके बारे में यहाँ ब्लॉग किया है:

रद्दीकरण

संक्षेप में:

var cancelled = token.WaitHandle.WaitOne(TimeSpan.FromSeconds(5));

आपके संदर्भ में:

void MyFunc (CancellationToken ct)
{
   //... 
   // simulate some long lasting operation that should be cancelable 
   var cancelled = ct.WaitHandle.WaitOne(TimeSpan.FromSeconds(10));
}

समय की एक निश्चित राशि के बाद एक अतुल्यकालिक ऑपरेशन को रद्द करने के लिए, जबकि अभी भी ऑपरेशन को रद्द करने में सक्षम होने के नाते मैन्युअल रूप से निम्नलिखित जैसे कुछ का उपयोग करें

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
cts.CancelAfter(5000);

यह पाँच सेकंड के बाद रद्दीकरण का कारण बनेगा। ऑपरेशन को रद्द करने के लिए आपको जो भी करना है, उसे अपने async विधि में token पास करना होगा और cts.Cancel() पद्धति का उपयोग करना होगा, जहाँ आपने cts.Cancel() आग cts.Cancel() लिए एक इवेंट हैंडलर स्थापित किया है।

तो एक पूर्ण उदाहरण है:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
cts.CancelAfter(5000);

// Set up the event handler on some button.
if (cancelSource != null)
{
    cancelHandler = delegate
    {
        Cancel(cts);
    };
    stopButton.Click -= cancelHandler;
    stopButton.Click += cancelHandler;
}

// Now launch the method.
SomeMethodAsync(token);

जहाँ stopButton वह बटन है जिसे आप रनिंग कार्य को रद्द करने के लिए क्लिक करते हैं

private void Cancel(CancellationTokenSource cts)
{
    cts.Cancel();
}

और विधि के रूप में परिभाषित किया गया है

SomeMethodAsync(CancellationToken token)
{
    Task t = Task.Factory.StartNew(() => 
        {
            msTimeout = 5000;
            Pump(token);
        }, token,
           TaskCreationOptions.None,
           TaskScheduler.Default);
}

अब, आपको थ्रेड को काम करने में सक्षम करने के लिए लेकिन उपयोगकर्ता रद्द करने में भी सक्षम है, आपको एक 'पंपिंग' विधि लिखनी होगी

int msTimeout;
bool timeLimitReached = false;
private void Pump(CancellationToken token)
{
    DateTime now = DateTime.Now;
    System.Timer t = new System.Timer(100);
    t.Elapsed -= t_Elapsed;
    t.Elapsed += t_Elapsed;
    t.Start();
    while(!timeLimitReached)
    {
        Thread.Sleep(250);
        token.ThrowIfCancellationRequested();
    }
}

void t_Elapsed(object sender, ElapsedEventArgs e)
{
    TimeSpan elapsed = DateTime.Now - this.readyUpInitialised;
    if (elapsed > msTimeout)
    {
        timeLimitReached = true;
        t.Stop();
        t.Dispose();
    }
}

ध्यान दें, SomeAsyncMethod कॉलर पर सही वापस आएगा। कॉलर को अस्वस्थ करने के लिए आपको कॉल पदानुक्रम में Task ऊपर ले जाना होगा।







cancellationtokensource