के साथ सॉकेट.ReceiveAsync को प्रतिस्थापित करना मेरे पास एक ऐसा एप्लिकेशन है जो एक ही समय में कुछ सौ टीसीपी कनेक्शन बनाता है, और उनसे डेटा की लगातार स्ट्रीम प्राप्त करता है।नेटवर्कस्ट्रीम.ReadAsync (प्रतीक्षा करने योग्य)
private void startReceive()
{
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += receiveCompleted;
e.SetBuffer(new byte[1024], 0, 1024);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
void receiveCompleted(object sender, SocketAsyncEventArgs e)
{
ProcessData(e);
if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
}
मेरे प्रयास कुछ इस तरह करने के लिए नेतृत्व:
private async void StartReceive()
{
byte[] Buff = new byte[1024];
int recv = 0;
while (Socket.Connected)
{
recv = await NetworkStream.ReadAsync(Buff, 0, 1024);
ProcessData(Buff,recv);
}
}
मुद्दा मैं विधि StartReceive()
बुला ब्लॉक कर देगा था, और साथ StartSend() method called after
StartReceive() . Creating a new task for
StartReceive() would just end up with 300-ish threads, and it seems to do so just by calling
StartReceive को नहीं मिल() 'वैसे भी।
क्या है, जबकि एक NetworkStream
का उपयोग कर तो यह थ्रेड पूल कि Socket.SendAsync()
और Socket.ReceiveAsync()
धागे/कार्य के सैकड़ों करने के लिए होने से बचाने के प्रयोग कर रहे हैं उपयोग कर रहा है अपने मौजूदा कोड पर नए async
और await
कीवर्ड को लागू करने का सही तरीका होगा?
के साथ I/O पूरा होने वाले बंदरगाहों पर networkstream
का उपयोग करने का कोई प्रदर्शन लाभ है?
यह वास्तव में स्पष्ट नहीं है कि समस्या क्या है, या संदर्भ - आप कॉलिंग विधि अवरुद्ध करने के बारे में बात करते हैं ... यह क्या अवरुद्ध कर रहा है? क्या आपको यह समस्या ठीक करने की आवश्यकता नहीं है? कृपया अपने प्रश्न को स्पष्ट करें - साथ ही यह इंगित करते हुए कि वास्तविक "काम" में कोई भी थ्रेड एफ़िनिटी है (उदा। यूआई थ्रेड के लिए)। –
वैसे मुख्य मुद्दा यह है कि नेटवर्कस्ट्रीम का इंतजार कर रहे संस्करण। रीडएसिंक एप्लिकेशन को प्रति कनेक्शन एक थ्रेड बनाने का कारण बनता है। Socket.ReceiveAsync का उपयोग करने के रूप में सभी 300 कनेक्शन के लिए 30 धागे के तहत होवर लगता है। – Josh