2017-08-31 10 views
5

मैं एक ग्रुप सर्वर को कंसोल डिमन के रूप में चलाने की कोशिश कर रहा हूं। यह जीआरपीसी सर्वर एक माइक्रोस्कोयर है जो एक डॉकर कंटेनर में चलता है।डॉटनेट कोर ग्रुप सर्वर को कंसोल एप्लिकेशन के रूप में चलते रहें?

उदाहरण के सभी मैं का उपयोग कर प्राप्त कर सकते हैं निम्नलिखित:

Console.ReadKey(); 

यह वास्तव में मुख्य थ्रेड ब्लॉक और इसे चलाने लेकिन निम्न त्रुटि के साथ डोकर में काम नहीं करता रहता है:

"Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read." 

अब मैं शायद विशेष रूप से डॉकर के लिए कामकाज खोजने की कोशिश कर सकता हूं, लेकिन यह अभी भी सही नहीं लगता है। क्या किसी को सेवा चलाने के लिए एक अच्छा "उत्पादन तैयार" तरीका पता है?

+0

अगर आप '-it' का उपयोग जब शुरू यह काम करेंगे डॉकर कंटेनर। यदि यह आपके लिए काम नहीं करता है, तो आप केवल थ्रेड के साथ मुख्य धागे को अनिश्चित काल तक सो सकते हैं। स्लीप (टाइमआउट। अनंत) ' –

+0

डॉकर कंटेनर क्लाउड प्लेटफॉर्म पर कुबेरनेट क्लस्टर में तैनात किया गया है। इंटरेक्टिव कंटेनर एक विकल्प नहीं हैं। थ्रेड के साथ समस्या। नींद यह है कि कंटेनर उदाहरण के लिए बंद होने पर grpc सर्वर का कोई शानदार शटडाउन नहीं है। –

उत्तर

5

मुख्य थ्रेड को अवरुद्ध करने के लिए ManualResetEvent का उपयोग करें जब तक आपको शट डाउन ईवेंट प्राप्त न हो जाए।

एक छोटी सी स्थिति में

उदाहरण के लिए:

class Program 
{ 
    public static ManualResetEvent Shutdown = new ManualResetEvent(false); 

    static void Main(string[] args) 
    { 
    Task.Run(() => 
    { 
     Console.WriteLine("Waiting in other thread..."); 
     Thread.Sleep(2000); 
     Shutdown.Set(); 
    }); 

    Console.WriteLine("Waiting for signal"); 
    Shutdown.WaitOne(); 

    Console.WriteLine("Resolved"); 
    } 
} 

उदाहरण के लिए, आपके मामले में, मैं की तरह कुछ कल्पना:

using System; 
using System.Net.Sockets; 
using System.Threading; 
using System.Threading.Tasks; 
using Grpc.Core; 
using Helloworld; 

namespace GreeterServer 
{ 
    class GreeterImpl : Greeter.GreeterBase 
    { 
    // Server side handler of the SayHello RPC 
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) 
    { 
     Program.Shutdown.Set(); // <--- Signals the main thread to continue 
     return Task.FromResult(new HelloReply {Message = "Hello " + request.Name}); 
    } 
    } 

    class Program 
    { 
    const int Port = 50051; 

    public static ManualResetEvent Shutdown = new ManualResetEvent(false); 

    public static void Main(string[] args) 
    { 
     Server server = new Server 
     { 
     Services = {Greeter.BindService(new GreeterImpl())}, 
     Ports = {new ServerPort("localhost", Port, ServerCredentials.Insecure)} 
     }; 
     server.Start(); 

     Shutdown.WaitOne(); // <--- Waits for ever or signal received 

     server.ShutdownAsync().Wait(); 
    } 
    } 
} 
+0

इसे आज़माने के लिए जा रहे हैं और आपको अपडेट रखेंगे। धन्यवाद! –

+0

कोई भी 'async Main' का उपयोग कर सकता है और इसके बजाय' कार्य पूर्णीकरण स्रोत 'ऑब्जेक्ट का उपयोग कर सकता है, यह किसी अन्य काम के लिए मुख्य धागे को मुक्त कर देगा। – VMAtm

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