1

ServiceStack フレームワークに基づくサービスでノンブロッキング リクエストを処理する方法を探しています。そのため、AppHostHttpListenerLongRunningBase クラス (現時点では自己ホスト型アプリが必要です) があることを確認しましたが、このクラスの使用方法の良い例はありません。

簡単な例を見てみましょう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface;
using ServiceStack.WebHost.Endpoints;


public class Hello
{
    public String Name { get; set; }
}

public class HelloResponse
{
    public String Result { get; set; }
}

public class HelloService : Service
{
    public Object Any(Hello request)
    {
        //Emulate a long operation
        Thread.Sleep(10000);
        return new HelloResponse { Result = "Message from " + request.Name };
    }
}

public class HelloAppHost : AppHostHttpListenerLongRunningBase 
{
    public HelloAppHost()
        : base("Hello App Services", typeof(HelloService).Assembly)
    {
    }

    public override void Configure(Funq.Container container)
    {
        Routes
            .Add<Hello>("/hello")
            .Add<Hello>("/hello/{Name}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var appHost = new HelloAppHost();
        appHost.Init();
        appHost.Start("http://127.0.0.1:8080/");
        Console.ReadLine();
    }
}

したがって、アプリを実行して 2 つの要求を行うと、それらはシリアル モードで実行され、応答間に約 10 秒の遅延が生じます。ノンブロッキング リクエストを実行する方法はありますか (セルフ ホスト アプリ ソリューションがある場合)。

PS: Redis ベースのソリューションがあることは知っていますが、いくつかの理由で適切ではありません。

4

1 に答える 1

1

thread.sleep が 10 秒の遅延の原因です。Web サービスは、必ずしもマルチスレッド アプリケーションとして作成されているわけではありません。私が見つけたのは、一般的な応答をキャッシュすることで応答を非常に迅速にすることであり、現在そこにあるスレッドのスリープ時間とほぼ同じくらい長く待つべきではありません。

于 2013-06-07T02:49:55.363 に答える