如何实现异步节俭服务器?

时间:2019-07-04 12:26:15

标签: c# async-await thrift

我在节俭时使用以下命令生成了一个异步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.");
    }

1 个答案:

答案 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源文件组装而成的,并简化为服务器。我没有测试此示例,但这就是它的外观。