ASP .NetCoreキューに入れられたバックグラウンドタスクの並列処理

LioH

ここで説明するようなキューに入れられたバックグラウンドタスクを使用するASP.NETコアWebAPIがあります

私は、提供されたコードのサンプルを使用して追加したIBackgroundTaskQueueBackgroundTaskQueueQueuedHostedServiceまったく同じ記事で説明します。

私の場合、次のようにStartup.cs1つのQueuedHostedServiceインスタンスのみを登録しています。services.AddHostedService<QueuedHostedService>();

WebApiのコントローラーからのタスクは、キューに入れられてからデキューされ、によって1つずつ実行されQueuedHostedServiceます。

着信タスクをデキューして実行する複数のバックグラウンド処理スレッドを許可したいと思います。私が思いつくことができる最も簡単な解決策はQueuedHostedService、私のに複数のインスタンスを登録することStartup.csです。つまり、次のようなものです。

 int maxNumOfParallelOperations;
 var isValid = int.TryParse(Configuration["App:MaxNumOfParallelOperations"], out maxNumOfParallelOperations);

 maxNumOfParallelOperations = isValid && maxNumOfParallelOperations > 0 ? maxNumOfParallelOperations : 2;

 for (int index = 0; index < maxNumOfParallelOperations; index++) 
 {
    services.AddHostedService<QueuedHostedService>();
 }

また、の単一のセマフォのおかげBackgroundTaskQueueで、QueuedHostedServiceインスタンスは実際には常に機能しているわけではなく、新しいタスクがキューで使用可能になったときにのみ起動することに気付きました

このソリューションは、私のテストでは問題なく機能しているようです。

しかし、この特定のユースケースでは、並列処理に本当に有効で推奨されるソリューションですか?

dbvega

を使用するためIHostedServiceに、いくつかのスレッドでを使用できますIBackgroundTaskQueue

これが基本的な実装です。私はあなたが同じものIBackgroundTaskQueue使用していて、ここBackgroundTaskQueue説明さていると仮定します

public class QueuedHostedService : IHostedService
{
    private readonly ILogger _logger;

    private readonly Task[] _executors;
    private readonly int _executorsCount = 2; //--default value: 2
    private CancellationTokenSource _tokenSource;
    public IBackgroundTaskQueue TaskQueue { get; }

    public QueuedHostedService(IBackgroundTaskQueue taskQueue,
        ILoggerFactory loggerFactory,
        IConfiguration configuration)
    {
        TaskQueue = taskQueue;
        _logger = loggerFactory.CreateLogger<QueuedHostedService>();

        if (ushort.TryParse(configuration["App:MaxNumOfParallelOperations"], out var ct))
        {
            _executorsCount = ct;
        }
        _executors = new Task[_executorsCount];
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Queued Hosted Service is starting.");

        _tokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

        for (var i = 0; i < _executorsCount; i++)
        {
            var executorTask = new Task(
                async () =>
                {
                    while (!cancellationToken.IsCancellationRequested)
                    {
#if DEBUG
                    _logger.LogInformation("Waiting background task...");
#endif
                    var workItem = await TaskQueue.DequeueAsync(cancellationToken);

                        try
                        {
#if DEBUG
                        _logger.LogInformation("Got background task, executing...");
#endif
                        await workItem(cancellationToken);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex,
                                "Error occurred executing {WorkItem}.", nameof(workItem)
                            );
                        }
                    }
                }, _tokenSource.Token);

            _executors[i] = executorTask;
            executorTask.Start();
        }

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Queued Hosted Service is stopping.");
        _tokenSource.Cancel(); // send the cancellation signal

        if (_executors != null)
        {
            // wait for _executors completion
            Task.WaitAll(_executors, cancellationToken);
        }

        return Task.CompletedTask;
    }
}

あなたには、サービスを登録する必要がConfigureServices上のStartupクラス。

...
services.AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>();
services.AddHostedService<QueuedHostedService>();
...

さらに、構成内のスレッド数を設定できます(appsettings.json

...
"App": {
    "MaxNumOfParallelOperations": 4
}
...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ASP.NETCoreのホストされたサービスとの並列キューバックグラウンドタスク

分類Dev

ASP.Net 5(vnext)バックグラウンドタスクをキューに入れてApplicationServicesにアクセスする方法

分類Dev

ASP.NETCoreのバックグラウンドタスクでのユーザーセッション

分類Dev

ASP.NET Core 3.1で、将来の特定の日時に、ホストされたサービスでバックグラウンドタスク(Cron Jobs)をスケジュールするにはどうすればよいですか?

分類Dev

ASP.NETCoreミドルウェアコンストラクターでの依存性注入と手動で渡されたパラメーターの混合

分類Dev

サーバー側ASP.NETC#からクライアント側から作成されたキャッシュ変数へのアクセス

分類Dev

チェックボックスリストにデータを入力しているときにエラーが発生しましたnullreferenceexceptionはユーザーコードによって処理されませんでしたか?Asp.net

分類Dev

asp.netMVC4でのバックグラウンドタスクの実行

分類Dev

ASP.NETCoreで期限切れの更新トークンを処理する

分類Dev

ASP.NET CoreWebアプリから呼び出される動的に検出された.NETCoreクラスライブラリ内にロガーを挿入するための適切なパターンは何ですか?

分類Dev

ASP.NETCoreフィルターによってスローされた例外の処理

分類Dev

ASP .NetCoreコンストラクターにAmazonS3サービスを挿入すると、「呼び出しのターゲットによって例外がスローされました」エラーが発生します

分類Dev

クラスライブラリからASP.NETCoreに配置された接続文字列を読み取ります。データベースファースト

分類Dev

<asp:literal>にバックエンドコードからのテキストを入力する

分類Dev

.NetCoreキューのバックグラウンドタスク

分類Dev

asp.net core 1.0 Web APIのスタートアップサービスでバックグラウンドタスクを作成するにはどうすればよいですか?

分類Dev

このリクエストの処理に必要なリソース(ASP.NETCore MVC)のコンパイル中にエラーが発生しました

分類Dev

C#ASP NET Coreのバックグラウンドサービス内でMediatorを使用するにはどうすればよいですか?

分類Dev

VisualStudioからASP.NETCoreソースコードをデバッグしているときに、スタックの途中でローカル変数が表示されないのはなぜですか

分類Dev

キューに入れられたバックグラウンドワークアイテムの遅延

分類Dev

asp.net ボタンをクリックしたらデータグリッドの並べ替えアクションを無効にできますか?

分類Dev

jQuery / asp.net-ユーザーがテキストボックスにテキストを入力し、ドロップダウンリストから値を選択した後にのみ[有効/無効]ボタン

分類Dev

C#は、asp.netコアホステッドサービスコンシューマーでいくつかの並列タスクを使用してIAsyncEnumerableアイテムを処理します

分類Dev

ネストされたx-form-urlencodedデータをAsp.NETCoreのDTOにマッピングする

分類Dev

SQLステートメントのドロップダウンメニューからselectedItemを使用して、C#asp.netのテキストボックスにデータを入力しようとしています。

分類Dev

asp.netプロジェクト(暗号化されたクラウドデータに対するマルチキーワードランク検索のプライバシー保護)

分類Dev

ドロップダウンリストにASP.NETCoreのActiveDirectoryグループのメンバーを入力するにはどうすればよいですか?

分類Dev

グリッドビュー(チェックボックス)に動的に追加されたコントロールは、asp.netでのポストバック後に消えます

分類Dev

バンドルされたビューからASP.NET/MVC WebページのヘッダーセクションにJavascriptを追加しますか?

Related 関連記事

  1. 1

    ASP.NETCoreのホストされたサービスとの並列キューバックグラウンドタスク

  2. 2

    ASP.Net 5(vnext)バックグラウンドタスクをキューに入れてApplicationServicesにアクセスする方法

  3. 3

    ASP.NETCoreのバックグラウンドタスクでのユーザーセッション

  4. 4

    ASP.NET Core 3.1で、将来の特定の日時に、ホストされたサービスでバックグラウンドタスク(Cron Jobs)をスケジュールするにはどうすればよいですか?

  5. 5

    ASP.NETCoreミドルウェアコンストラクターでの依存性注入と手動で渡されたパラメーターの混合

  6. 6

    サーバー側ASP.NETC#からクライアント側から作成されたキャッシュ変数へのアクセス

  7. 7

    チェックボックスリストにデータを入力しているときにエラーが発生しましたnullreferenceexceptionはユーザーコードによって処理されませんでしたか?Asp.net

  8. 8

    asp.netMVC4でのバックグラウンドタスクの実行

  9. 9

    ASP.NETCoreで期限切れの更新トークンを処理する

  10. 10

    ASP.NET CoreWebアプリから呼び出される動的に検出された.NETCoreクラスライブラリ内にロガーを挿入するための適切なパターンは何ですか?

  11. 11

    ASP.NETCoreフィルターによってスローされた例外の処理

  12. 12

    ASP .NetCoreコンストラクターにAmazonS3サービスを挿入すると、「呼び出しのターゲットによって例外がスローされました」エラーが発生します

  13. 13

    クラスライブラリからASP.NETCoreに配置された接続文字列を読み取ります。データベースファースト

  14. 14

    <asp:literal>にバックエンドコードからのテキストを入力する

  15. 15

    .NetCoreキューのバックグラウンドタスク

  16. 16

    asp.net core 1.0 Web APIのスタートアップサービスでバックグラウンドタスクを作成するにはどうすればよいですか?

  17. 17

    このリクエストの処理に必要なリソース(ASP.NETCore MVC)のコンパイル中にエラーが発生しました

  18. 18

    C#ASP NET Coreのバックグラウンドサービス内でMediatorを使用するにはどうすればよいですか?

  19. 19

    VisualStudioからASP.NETCoreソースコードをデバッグしているときに、スタックの途中でローカル変数が表示されないのはなぜですか

  20. 20

    キューに入れられたバックグラウンドワークアイテムの遅延

  21. 21

    asp.net ボタンをクリックしたらデータグリッドの並べ替えアクションを無効にできますか?

  22. 22

    jQuery / asp.net-ユーザーがテキストボックスにテキストを入力し、ドロップダウンリストから値を選択した後にのみ[有効/無効]ボタン

  23. 23

    C#は、asp.netコアホステッドサービスコンシューマーでいくつかの並列タスクを使用してIAsyncEnumerableアイテムを処理します

  24. 24

    ネストされたx-form-urlencodedデータをAsp.NETCoreのDTOにマッピングする

  25. 25

    SQLステートメントのドロップダウンメニューからselectedItemを使用して、C#asp.netのテキストボックスにデータを入力しようとしています。

  26. 26

    asp.netプロジェクト(暗号化されたクラウドデータに対するマルチキーワードランク検索のプライバシー保護)

  27. 27

    ドロップダウンリストにASP.NETCoreのActiveDirectoryグループのメンバーを入力するにはどうすればよいですか?

  28. 28

    グリッドビュー(チェックボックス)に動的に追加されたコントロールは、asp.netでのポストバック後に消えます

  29. 29

    バンドルされたビューからASP.NET/MVC WebページのヘッダーセクションにJavascriptを追加しますか?

ホットタグ

アーカイブ