2017-08-31 39 views
5

Bir GrPC sunucusunu konsol daemon olarak çalıştırmaya çalışıyorum. Bu gRPC sunucusu, bir docker kabında çalışan bir microservice'dir.Dotnet Core Grpc Server'ı konsol uygulaması olarak mı çalıştırıyorsunuz?

örneklerin hepsi ben faydalanmak bulabilirsiniz şunlardır:

Console.ReadKey(); 

Bu gerçekten ana iş parçacığı engellemek ve çalışan ancak aşağıdaki hata ile docker çalışmaz tutar kapsamaz:

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

Şimdi, özellikle docker için bir geçici çözüm bulmaya çalışabilirim, ancak bu hala doğru değil. Hizmeti çalıştırmak için iyi bir "üretim hazır" yolu bilen var mı?

+0

:

Örneğin
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"); } } 

senin olayda, şöyle bir şey hayal docker kabı. Bu sizin için işe yaramazsa, sadece thread.leep (Timeout.Infinite) ' –

+0

Docker konteyner bir bulut platformunda bir kubernetes küme içine yerleştirilir ile ana iş parçacığı uyuyabilirsiniz. Etkileşimli kapsayıcılar bir seçenek değildir. Thread.Sleep ile ilgili sorun, örneğin konteyner durdurulduğunda, grpc sunucusunun zarif bir şekilde kapatılmamasıdır. –

cevap

5

Bir kilitleme olayı alıncaya kadar ana iş parçacığını engellemek için ManualResetEvent kullanın. önemsiz bir durumda Örneğin

: yukarı başlatırken `-it` kullanmak eğer çalışacağız

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

Bunu denemeye ve sizi güncel tutmaya devam edecek. Teşekkürler! –

+0

Bir de 'async Main' kullanabilir ve' TaskCompletionSource' nesnesini kullanabilir, bunun yerine diğer bazı işlerin yapılması için ana iş parçacığını serbest bırakır. – VMAtm

İlgili konular