मैं एक पुस्तकालय का उपयोग कर रहा हूं जो आने वाले टीसीपी संदेशों को सुनता है (यह BeginAcceptTcpClient का उपयोग करता है)। इसका उद्देश्य पृष्ठभूमि में काम करना है, जबकि मेरा ऐप अन्य डेटा प्रोसेसिंग करता है। इंटरनेट से डेटा पढ़ने वाले कुछ अलग थ्रेड खोलने के बाद, मुख्य एप्लिकेशन थ्रेड को जारी रखने देता है।

परीक्षण करते समय, मैं इसे इस तरह उपयोग करता था:

static async Task Main(string[] args)
{
    [...]

    connectionsManager.Start();

    logger.LogInformation("Application started");

    Console.ReadLine();
}

जब मैं इसे स्थानीय रूप से परीक्षण कर रहा हूं, तो यह इरादा के अनुसार काम करता है: मैं एप्लिकेशन खोल सकता हूं और यह तब तक काम करता है जब तक मैं Enter दबाता हूं। लेकिन अब मैंने इसे डॉकटर का उपयोग करके वीपीएस पर चलाने का फैसला किया। यह पता चला है कि जब मैं पृष्ठभूमि ऐप के रूप में एक डॉकर कंटेनर चलाता हूं, तो यह लॉगर को "एप्लिकेशन प्रारंभ" लिखने के ठीक बाद बंद हो जाता है। Console.ReadLine() मुख्य थ्रेड को निलंबित नहीं करता है और भले ही अन्य थ्रेड अभी भी connectionManager में काम कर रहे हों, ऐप बंद हो जाता है।

बेशक, मैं एक अनंत लूप बना सकता हूं, लेकिन क्या ऐसा करने के कोई बेहतर तरीके हैं? मैं अप्रासंगिक कार्यों पर प्रसंस्करण शक्ति बर्बाद नहीं करना चाहता।

0
Piotrek 20 पद 2019, 14:32

1 उत्तर

सबसे बढ़िया उत्तर

इसे प्राप्त करने का एक बहुत ही सरल तरीका है

Thread.Sleep(Timeout.Infinite);

आप Timeout वर्ग को System.Threading नाम स्थान में पा सकते हैं, लेकिन वास्तव में, Infinite केवल const है जिसका मान -1 है।

एसिंक्स के लिए आप जा सकते हैं

await Task.Delay(Timeout.Infinite);
0
Eduard Dumitru 20 पद 2019, 11:38