使用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();
}
}
}
如果您在启动时使用'-it'它会工作码头集装箱。如果这不适合你,你可以通过'Thread.Sleep(Timeout.Infinite)' –
无限期地睡主线程。Docker容器被部署到云平台上的kubernetes集群中。交互容器不是一个选项。 Thread.Sleep的问题在于,例如当容器停止时grpc服务器没有正常关闭。 –