【发布时间】:2019-06-01 19:24:26
【问题描述】:
使用 Apache Thrift [https://github.com/apache/thrift] 在 C# 中创建非阻塞服务器时,无法识别以下类/类型:
TNonblockingServerTransport
TNonblockingServer
我想从我的 win10 笔记本电脑发送命令来控制在高性能服务器 (ubuntu) 上执行的耗时计算。这就是我来到 Apache Thrift 的原因。我找到了官方的 C# 版本教程 [https://github.com/apache/thrift/tree/master/tutorial/csharp],它运行良好。本教程使用所谓的阻塞模式 (TSimpleServer)。但在我的情况下,耗时的计算过程应该是可中断的。因此,我必须使用非阻塞服务器。
逻辑很简单。对于服务器,我使用了一个私有标志 forceStop。如果客户端调用 Stop(),forceStop 将设置为 true,计算循环将中断。
// #Server#
// Server Set-Up
private void SetUp()
{
try
{
CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor processor = new
Calculator.Processor(handler);
var serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(processor, serverTransport);
// Use this for a multithreaded server
// server = new TThreadPoolServer(processor, serverTransport);
Console.WriteLine("Starting the server...");
server.Serve();
}
catch (Exception x)
{
Console.WriteLine(x.StackTrace);
}
}
private bool forceStop;
public int TimeConsumingOperation(int n1, int n2)
{
Console.WriteLine("add({0},{1})", n1, n2);
for (int i = 0; i < 10; i++)
{
//calculating
Thread.Sleep(500);
if (forceStop)
{
Quit();
}
}
return n1 + n2;
}
public void Stop()
{
forceStop = true;
}
// Client
// Button#1 Click callback
private void Button_Start_Click()
{
client.TimeConsumingOperation(0,0);
}
// Button#2 Click callback
private void Button_Stop_Click()
{
client.Stop();
}
//
我在 java [https://chamibuddhika.wordpress.com/2011/10/02/apache-thrift-quickstart-tutorial/].我已经尽力将非阻塞服务器的java代码转换为相应的C#代码,但我发现C#中似乎没有TNonblockingServerTransport。有人可以帮我解决这个问题吗?
// Java Code
public class NonblockingServer {
private void start() {
try {
TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);
ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());
TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).
processor(processor));
System.out.println("Starting server on port 7911 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
NonblockingServer srv = new NonblockingServer();
srv.start();
}
}
【问题讨论】: