我在节俭时使用以下命令生成了一个异步c#类。
thrift-0.12.0.exe --gen csharp:async file.thrift
,然后在c#中以异步类型实现所有已定义的方法。 现在我的问题是:如何在c#中以异步类型运行的Thrift服务器? 以下来自GitHub上的Thrift存储库的示例是同步的。我需要它的异步版本。请有人帮我。
public static void Main()
{
try
{
CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor processor = new Calculator.Processor(handler);
TServerTransport 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);
}
Console.WriteLine("done.");
}
答案 0 :(得分:0)
你快到了。
thrift-0.12.0.exe --gen csharp:async file.thrift
这将为每个服务生成两个接口:“传统”同步IFace
和名为IAsync
的异步变体,这是您需要实现的。
此外,您不想使用YourService.Processor
实现,而是要使用YourService.AsyncProcessor
。
0.13.0的新netstd实现(在将来的版本中将废弃C#和netcore绑定)仅支持异步变体。
Example.thrift
namespace * Example
service Example {
double Ping(1: double input)
}
生成Example.cs
namespace Example
{
public interface IAsync {
Task<double> PingAsync(double input);
}
// more code ...
}
ExampleHandler.cs实现您的服务
namespace ExampleSvc
{
public class HandlerImpl : Example.Example.IAsync
{
public Task<double> PingAsync(double input, CancellationToken cancel)
{
return Task.FromResult(input);
}
}
}
ServerMain.cs设置服务器
// create protocol factory, we use framed compact
var protoFactory = new TCompactProtocol.Factory();
var transFactory = new TFramedTransport.Factory();
var handler = new ExampleSvc.HandlerImpl();
var processor = new Example.Example.AsyncProcessor(handler);
var servertrans = new TServerSocketTransport(9000);
var serverEngine = new TThreadPoolAsyncServer(processor, servertrans, transportFactory, protocolFactory);
serverEngine.ServeAsync(CancellationToken.None).Wait();
特别是后者是从一个更大的netstd源文件组装而成的,并简化为服务器。我没有测试此示例,但这就是它的外观。