2011-02-16 10 views
19

मैं सोच रहा था कि टीपीएल TaskFactory.FromAsync और विधियों के संस्करणों को अवरुद्ध करने पर TaskFactory.StartNew का उपयोग करने के बीच कोई प्रदर्शन प्रभाव था या नहीं। मैं एक टीसीपी सर्वर लिख रहा हूं जो 100 से अधिक समवर्ती कनेक्शन का समर्थन नहीं करेगा। पहले विकल्प & के साथ कोड लिखने के बाद एकाधिक पढ़ने & जारी रखने के साथ ऑपरेशन लिखने के बाद, मुझे बदसूरत, हार्ड कोड को डीबग करने के लिए छोड़ दिया गया था।TPL TaskFactory.FromAsync बनाम ब्लॉकिंग विधियों के साथ कार्य

मुझे लगता है कि सिंक्रोनस संस्करण & के साथ कोड लिखने पर विश्वास है तो इसे एक कार्य के साथ लपेटकर जटिलता & टेस्टेबिलिटी में वृद्धि होगी, लेकिन मैं ऐसा करने के प्रदर्शन के प्रभावों के बारे में चिंतित हूं।

उदाहरण के लिए, इन 2 कॉल के बीच किसी भी प्रदर्शन अंतर हैं:

NetworkStream stream; 
byte[] data; 
int bytesRead; 

//using FromAsync 
Task<int> readChunk = Task<int>.Factory.FromAsync (
     stream.BeginRead, stream.EndRead, 
     data, bytesRead, data.Length - bytesRead, null); 

//using StartNew with blocking version 
Task<int> readChunk2 = Task<int>.Factory.StartNew(() => 
     stream.Read(data, bytesRead, data.Length - bytesRead)); 

उत्तर

45

आप बिल्कुलFromAsync उपयोग करना चाहते हैं जब एक API एक BeginXXX/EndXXX एक विधि के संस्करण प्रदान करता है। अंतर यह है कि, Stream या Socket या WebRequest जैसे किसी मामले के मामले में, आप वास्तव में कवर के नीचे एसिंक I/O (जैसे विंडोज़ पर I/O प्राप्ति बंदरगाहों) का उपयोग करके समाप्त हो जाएंगे जो एकाधिक CPU को अवरुद्ध करने से कहीं अधिक कुशल है एक सिंक्रोनस ऑपरेशन कर रहे धागे। ये विधियां I/O स्केलेबिलिटी प्राप्त करने का सबसे अच्छा तरीका प्रदान करती हैं।

एएसआईएनसी निर्वाण प्राप्त करने के लिए इन दो प्रोग्रामिंग मॉडल को गठबंधन करने के तरीके के बारे में अधिक जानकारी के लिए एमएसडीएन पर .NET SDK के इस अनुभाग को TPL and Traditional .NET Asynchronous Programming पर देखें।

+1

आप किसी भी स्रोत जो एक वेब विधि बुला कहना है (उदाहरण के लिए) Async के साथ सिंक्रोनस संस्करण का उपयोग करने से Async के साथ प्रारंभ/अंत का उपयोग करना बेहतर है? आप जो कहते हैं वह समझ में आता है, मैं इसे कहीं कहीं आधिकारिक पढ़ना पसंद करता हूं। –

5

एक बाहरी लिंक से एक प्रति के बाद:

हां। .NET 4 में, कार्य समांतर लाइब्रेरी में एपीएम पैटर्न (आरंभ/समाप्ति) के लिए एक निर्मित रैपर शामिल है: Task.Factory.FromAsync। उदाहरण के लिए, अगर आप स्ट्रीम के BeginRead/EndRead विधि के लिए एक कॉल के लिए एक कार्य बनाना चाहता था, तुम कर सकते हो:

Stream s = ...; 
byte [] buffer = ...; 
Task<int> numBytesRead = Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null); 
// or with await 
int numBytesRead = await Task<int>.Factory.FromAsync(s.BeginRead, s.EndRead, buffer, 0, buffer.Length, null); 

Under the covers, FromAsync is just built on top of TaskCompletionSource<TResult>. A simple version of FromAsync for this read example would look something like: 

var tcs = new TaskCompletionSource<TResult>(); 
s.BeginRead(buffer, 0, buffer.Length, iar => 
{ 
    try { tcs.SetResult(s.EndRead(iar)); } 
    catch(Exception exc) { tcs.SetException(exc); } 
}, null); 
Task<int> numBytesRead = tcs.Task; 

http://social.msdn.microsoft.com/Forums/en/async/thread/ed8a14e8-d19a-42d1-bc3f-7017bdfed09c

+3

कृपया बाहरी लिंक की सामग्री प्रदान करें। अन्यथा यदि लिंक टूट जाता है तो आपका उत्तर बेकार है। – sra

+2

अगर एमएसडीएन टूटता है, तो हम सभी बेकार हैं –

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