يضبط فاحص الوكيل SendTimeout = 200، ويستدعي Connect، ثم ينتظر أطول بكثير مما هو متوقع. المهلة معلقة على عملية لم يصل إليها الفاحص بعد.

يتحكم Socket.SendTimeout في الإرسال المتزامن. وهو لا يمنح محاولة اتصال متزامنة مهلة 200 ms. وإضافة انتظار قبل Connect لا تضيف إلا تأخيرًا آخر.

ألغِ العملية التي تنتظر

على هدف .NET حديث يوفّر التحميل القابل للإلغاء، يمكن لفحص غير متزامن أن يطبّق ميزانيته على إنشاء الاتصال:

using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);

ينتمي المقطع إلى طريقة غير متزامنة، مع تزويد مضيف الوكيل ومنفذه من المستدعي؛ ويمكن لمرشح عام من قائمة وكلاء أن يوفّر هذين المدخلين. تعامل مع الإلغاء بشكل منفصل عن خطأ المقبس إذا أبلغ الفاحص عن أسباب الفشل. كما أن التخلص من العميل يمنع الفحوص المكتملة من تكديس المقابس.

لا يمتلك كود .NET Framework الأقدم كل التحميلات الحديثة. استخدم ترتيب اتصال غير متزامن مدعومًا وأغلق المقبس صراحةً عند التخلي عن المحاولة. مجرد إيقاف انتظارك لا يثبت أن عملية أساسية قد توقفت.

النتيجة الخضراء ما زالت نتيجة صغيرة

اتصال TCP ناجح يثبت أن هذا العميل وصل إلى نقطة نهاية تستمع. لكنه لم يتفاوض على SOCKS، ولم يصادق على وكيل HTTP، ولم يفتح CONNECT، ولم يتلقَّ استجابة الموقع المطلوبة.

امنح تلك المراحل اللاحقة معالجة محدودة خاصة بها، أو مرّر عبرها موعدًا نهائيًا إجماليًا مقصودًا. وإلا فقد يعمل مؤقت الاتصال المُصلح بشكل مثالي بينما يقضي الفاحص دقيقة أخرى في انتظار مصافحة الوكيل.

مقالات ذات صلة