2016-05-04 10 views
6

मेरे पास एक ऐसा कार्य है जो एक लूप चलाता है और प्रत्येक पुनरावृत्ति के अंतराल के लिए देरी करता है। एक बार CancellationTokenSourceCancel() पर कॉल करता है, मैं अपना मुख्य कोड पर Task.Delay(interval) के लिए समाप्त करना चाहता हूं और मेरे कोड जारी होने से पहले लूप से बाहर निकलने का कार्य चाहता हूं। मैंने सोचा कि यह कोड काम करेगा लेकिन यह नहीं करता है।मेरा कोड प्रतीक्षा कोड से पहले क्यों समाप्त नहीं हो रहा है प्रतीक्षा कोड

इसके बजाय मेरा मुख्य कोड लूप निकास से पहले t.Wait() पास करता है। क्यूं कर?

मुख्य विधि कोड:

var cts = new CancellationTokenSource(); 
CancellationToken ct = cts.Token; 

var t = Task.Run(() => { MyLoopTask(200, ct); }); 

// Prepare information 

cts.Cancel(); 
t.Wait();  

// Send Information 

टास्क कोड

private async Task MyLoopTask(int interval, CancellationToken cancelToken) 
{ 
    while (!cancelToken.IsCancellationRequested) 
    { 
     Debug.Print(" Still In Loop  "); 
     // Do something 
     await Task.Delay(interval); 
    } 

    Debug.Print(" cancelled  "); 
    //Clean up 
} 
+1

पोस्ट कोड – dotctor

+0

क्या हो रहा है यह जानने के लिए मैं मुख्य विधि कोड को और अधिक देखना चाहता हूं। –

+0

यह बहुत बड़ा है, मैं कोशिश करूँगा और सार्थक खंड में इसे पार्स कर दूंगा। –

उत्तर

9

आप Task.Run कि आग के साथ एक कार्य बना सकते हैं और वास्तविक कार्य आप MyLoopTask से वापस पाने के भूल जाता है।

Task.Run यहां अनावश्यक है। आप बस MyLoopTask पर कॉल कर सकते हैं और उस कार्य का उपयोग कर सकते हैं जो इसे लौटाता है।

var t = MyLoopTask(200, ct); 
// ... 
t.Wait(); 

आप अभी भी Task.Run उपयोग करने के लिए क्या आप वाकई वास्तविक कार्य के लिए प्रतिनिधि प्रतीक्षा करता है यह इंतजार कर रहा द्वारा बनाकर ऐसा कर सकते हैं किसी कारण है: `cts` और` ct` के लिए

var t = Task.Run(async() => await MyLoopTask(200, ct)); 
// ... 
t.Wait();  
+0

प्रतिक्रिया के लिए धन्यवाद। मैं देख रहा हूं कि आप क्या कह रहे हैं - टास्क.रुन ने एक टास्क ऑब्जेक्ट बनाया जो मेरी विधि को बंद कर देता है और चूंकि वह विधि कार्य को अतुल्यकालिक भी करती है। रुन टास्क ऑब्जेक्ट तुरंत समाप्त हो जाता है। यह समझ में आता है। –

+0

@AdamHeeg हां। तकनीकी रूप से बाहरी 'कार्य' आपकी विधि में पहले असीमित बिंदु में पूर्ण होता है जो पहली बार 'कार्य। डेले' का इंतजार कर रहा है। – i3arnon

+0

'var t = कार्य। रुन (() => MyLoopTask (200, सीटी)); 'भी काम करेगा। – svick

संबंधित मुद्दे