2011-11-23 17 views
39

this question के बाद कॉलबैक को परिभाषित करने के लिए, मैं टीपीएल का उपयोग करके एसिंक विधि को लागू करने और टीएपी दिशानिर्देशों का पालन करने की कोशिश कर रहा हूं।टास्क आधारित एसिंक्रोनस विधि

मैं अपने एसिंक विधि को समाप्त होने पर कॉलबैक करने के लिए चाहता हूं। जहां तक ​​मैं देख सकता हूं कि तीन तरीके हैं जो मैं कर सकता हूं।

1) कॉलबैक हस्तचालित रूप से अपने कार्य प्रतिनिधि

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 

     //call callback manually 
     completedCallback(); 
    }); 
} 

2) कॉलबैक निरुपित कार्य प्रतिनिधि

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 
    } 
    ).ContinueWith(completedCallback); //assign callback to Task 
} 

3 में कार्य करने) कॉलबैक निरुपित फोन करने वाले

public Task DoWorkAsync() 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 
    }); 
} 

public void SomeClientCode() 
{ 
    Task doingWork = DoWorkAsync(); 
    doingWork.ContinueWith(OnWorkCompleted); 
} 

में कार्य करने में मेरा आंत महसूस करना है कि 3 अधिक सही है, क्योंकि यह विधि से कॉलबैक को रद्द करता है, और इसका मतलब क्लाइंट है कोड किसी भी तरह फिट (कॉलबैक, मतदान आदि का उपयोग करके) को प्रबंधित कर सकता है, जो कि कार्य के बारे में क्या लगता है। हालांकि, क्या होता है यदि क्लाइंट कोड कॉलबैक को हुक करने से पहले DoWorkAsync() अपना काम पूरा करता है?

क्या ऐसा करने के लिए एक आम तौर पर स्वीकार्य तरीका है या यह सब नया है?

क्या 2 का कोई फायदा है) 1)?

उत्तर

28

आम तौर पर स्वीकार रास्ता 3.

TPL के उपयोगकर्ताओं को आम तौर पर पता है कि वे ContinueWith के साथ एक टास्क जारी रखने के लिए कर सकते हैं। 1 और 2 समान कार्यक्षमता प्रदान करते हैं, लेकिन गैर-मानक इंटरफ़ेस के साथ; उपयोगकर्ता को यह पता लगाना होगा कि प्रतिनिधि पैरामीटर का क्या अर्थ है और क्या पास करना है। अगर वे जारी नहीं रखना चाहते हैं - यह सब तब भी है जब विधि अभी भी एक कार्य लौटाती है जिसे मानक तरीके से जारी रखा जा सकता है।

+4

धन्यवाद, यह समझ में आता है। 3 के साथ जाएगा। लेकिन क्या होता है यदि कार्य जारी रखने से पहले कार्य पूरा हो जाता है? क्या यह अभी भी बुलाया जाता है? मैं दस्तावेज़ों को थोड़ा अस्पष्ट खोज रहा हूं। – GazTheDestroyer

+3

हां, इसे बुलाया जाता है। – dtb

+0

मेरे पास उदाहरण के लिए एक प्रश्न है 3. यदि कुछ क्लाइंटकोड() यूई थ्रेड (डब्ल्यूपीएफ) पर चल रहा है, तो ऑनवर्क्स भी यूई थ्रेड पर होगा? या एक ही थ्रेड जो एसिंक काम करता है? –

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