バックグラウンドWebAPIでストアドプロシージャを実行する

アレックス・デュボビク

私のWebApiアプリケーションでは、次のトピックのようなことを行う必要があります。ASP.NetWebアプリでバックグラウンドタスクを実行し、フィードバックを取得するための最良の方法は?アプリケーションでは、ユーザーはExcelファイルをアップロードしてから、そのデータをデータベース内のテーブルにインポートできます。すべて正常に機能しますが、インポートプロセスには長い時間がかかる可能性があり(Excelに行が多い場合は、約20分)、プロセスが開始されるとページがブロックされ、ユーザーはこの間ずっと待つ必要があります。このインポートプロセスをバックグラウンドで実行する必要があります。

私はこのPOSTメソッドを備えたコントローラーを持っています:

[HttpPost]
public async Task<IHttpActionResult> ImportFile(int procId, int fileId)
{
    string importErrorMessage = String.Empty;

    // Get excel file and read it
    string path = FilePath(fileId);
    DataTable table = GetTable(path);

    // Add record for start process in table Logs
    using (var transaction = db.Database.BeginTransaction()))
    {
        try
        {
            db.uspAddLog(fileId, "Process Started", "The process is started");
            transaction.Commit();
        }
        catch (Exception e)
        {
            transaction.Rollback();
            importErrorMessage = e.Message;
            return BadRequest(importErrorMessage);
        }
    }

    //Using myHelper start a store procedure, which import data from excel file
    //The procedure also add record in table Logs when it is finished
    using (myHelper helper = new myHelper())
    helper.StartImport(procId, fileId, table, ref importErrorMessage);

        if (!String.IsNullOrEmpty(importErrorMessage))
        return BadRequest(importErrorMessage);

    return Ok(true);
}

ファイルとそのプロセスに関する情報を返すGETメソッドもあります

[HttpGet]
[ResponseType(typeof(FileDTO))]
public IQueryable<FileDTO> GetFiles(int procId)
{
    return db.LeadProcessControl.Where(a => a.ProcessID == procId)
                                .Project().To<FileDTO>();
}

次のようなJSONを返します。

{
  FileName = name.xlsx
  FileID = 23
  ProcessID = 11
  Status = Started
}

この方法はGRID用です

File name | Status | Button to run import | Button to delete file

これStatusはテーブルLogsからのものでFileDTOあり、最後の値が配置されています。たとえば、ファイルをアップロードすると、statusインポートを実行すると「ファイルがアップロードされました」になり、インポートstatusが終了statusすると「完了」になります。ただし、インポートプロセスの実行中にページがロックされるようになったため、ステータスは常に「完了」になります。

したがって、プロシージャをバックグラウンドで実行する必要があり、Status変更されている場合はGETメソッドがnewを返す必要があります。助言がありますか?

ディーパクバティア

メソッドにasyncを追加しても、メソッド呼び出しは非同期になりません。これは、現在の要求を処理しているスレッドが、ネットワーク/ディスクIOを待機している間に、他の要求を処理するために再利用できることを示しているだけです。クライアントがこのメソッドを呼び出すと、メソッドが完了したときにのみ応答が返されます。言い換えれば、非同期は完全にサーバー側のものであり、クライアント呼び出しとは何の関係もありません。以下に示すように、長時間実行されるプロセスを別のスレッドで開始する必要があります。ただし、ベストプラクティスは、このような長時間実行される処理にWebアプリを使用せず、代わりに別のWindowsサービスで長時間処理を実行することです。

[HttpPost]
    public async Task<IHttpActionResult> ImportFile(int procId, int fileId)
{
string importErrorMessage = String.Empty;

// Get excel file and read it
string path = FilePath(fileId);
DataTable table = GetTable(path);

// Add record for start process in table Logs
using (var transaction = db.Database.BeginTransaction()))
{
    try
    {
        db.uspAddLog(fileId, "Process Started", "The process is started");
        transaction.Commit();
    }
    catch (Exception e)
    {
        transaction.Rollback();
        importErrorMessage = e.Message;
        return BadRequest(importErrorMessage);
    }
}

         //Start long running process in new thread
         Task.Factory.StartNew(()=>{

         using (myHelper helper = new myHelper())
        {
           helper.StartImport(procId, fileId, table, ref importErrorMessage);

          //** As this code is running background thread you cannot return anything here. You just need to store status in database. 

         //if (!String.IsNullOrEmpty(importErrorMessage))
         //return BadRequest(importErrorMessage);
       }

        });

//You always return ok to indicate background process started
return Ok(true);
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

バックグラウンドスレッドiOSでプッシャーを実行する

分類Dev

alamofireバックグラウンドアップロードリクエストを実行する方法は?

分類Dev

入力を常にチェックしながらバックグラウンドプロシージャを実行する方法-スレッド化?

分類Dev

Pythonクライアントを使用してSQLServerでストアドプロシージャを実行する

分類Dev

Pythonクライアントを使用してSQLServerでストアドプロシージャを実行する

分類Dev

バックグラウンドでジョブを実行するWPFアプリケーション

分類Dev

バックグラウンドでタスクを実行するiOSアプリケーション

分類Dev

EntityFrameworkのストアドプロシージャ実行コードをタスクにラップする

分類Dev

常に実行されるバックグラウンドアプリに使用する.NETプロジェクト/サービスは何ですか?

分類Dev

角度2アプリケーションのバックグラウンド/セパレートスレッドで関数を実行する

分類Dev

Linuxでバックグラウンドでプロセスを実行する

分類Dev

ブロードキャストレシーバーをバックグラウンドで実行し続ける方法は?

分類Dev

リンクサーバーを使用して動的SQLServerストアドプロシージャを実行する

分類Dev

どのようにJAVAを使用してバックグラウンドで実行中のアプリケーションを除いて、タスクマネージャのように、現在実行中のアプリケーションのリストを取得するには?

分類Dev

バックグラウンドでサブプロセスを実行する

分類Dev

symfonyでバックグラウンドプロセスを実行する方法

分類Dev

Pythonでバックグラウンドプロセスを実行する

分類Dev

arduinoでバックグラウンドプロセスを実行する

分類Dev

バックグラウンド python で GPIO プロセスを実行する

分類Dev

PHPスクリプトをバックグラウンドで実行する

分類Dev

Pythonスクリプトをバックグラウンドで実行する

分類Dev

デッドロックなしでストアドプロシージャを実行し、しっかりとハングアップせずにアプリケーションを実行する

分類Dev

バックグラウンドプロセスでsshスクリプトを実行する

分類Dev

バックグラウンドスレッドでハンドラーメッセージを実行する

分類Dev

Railsコントローラーで短いバックグラウンドタスクを実行する

分類Dev

ストアドプロシージャでストアドステートメントを実行する方法

分類Dev

スリープ/バックグラウンドモードで実行するようにiOSVoIPアプリケーションを構成する

分類Dev

パラメータ入力でボタンクリック時にストアドプロシージャを実行する方法

分類Dev

J2MEアプリケーションをバックグラウンドで実行する方法は?

Related 関連記事

  1. 1

    バックグラウンドスレッドiOSでプッシャーを実行する

  2. 2

    alamofireバックグラウンドアップロードリクエストを実行する方法は?

  3. 3

    入力を常にチェックしながらバックグラウンドプロシージャを実行する方法-スレッド化?

  4. 4

    Pythonクライアントを使用してSQLServerでストアドプロシージャを実行する

  5. 5

    Pythonクライアントを使用してSQLServerでストアドプロシージャを実行する

  6. 6

    バックグラウンドでジョブを実行するWPFアプリケーション

  7. 7

    バックグラウンドでタスクを実行するiOSアプリケーション

  8. 8

    EntityFrameworkのストアドプロシージャ実行コードをタスクにラップする

  9. 9

    常に実行されるバックグラウンドアプリに使用する.NETプロジェクト/サービスは何ですか?

  10. 10

    角度2アプリケーションのバックグラウンド/セパレートスレッドで関数を実行する

  11. 11

    Linuxでバックグラウンドでプロセスを実行する

  12. 12

    ブロードキャストレシーバーをバックグラウンドで実行し続ける方法は?

  13. 13

    リンクサーバーを使用して動的SQLServerストアドプロシージャを実行する

  14. 14

    どのようにJAVAを使用してバックグラウンドで実行中のアプリケーションを除いて、タスクマネージャのように、現在実行中のアプリケーションのリストを取得するには?

  15. 15

    バックグラウンドでサブプロセスを実行する

  16. 16

    symfonyでバックグラウンドプロセスを実行する方法

  17. 17

    Pythonでバックグラウンドプロセスを実行する

  18. 18

    arduinoでバックグラウンドプロセスを実行する

  19. 19

    バックグラウンド python で GPIO プロセスを実行する

  20. 20

    PHPスクリプトをバックグラウンドで実行する

  21. 21

    Pythonスクリプトをバックグラウンドで実行する

  22. 22

    デッドロックなしでストアドプロシージャを実行し、しっかりとハングアップせずにアプリケーションを実行する

  23. 23

    バックグラウンドプロセスでsshスクリプトを実行する

  24. 24

    バックグラウンドスレッドでハンドラーメッセージを実行する

  25. 25

    Railsコントローラーで短いバックグラウンドタスクを実行する

  26. 26

    ストアドプロシージャでストアドステートメントを実行する方法

  27. 27

    スリープ/バックグラウンドモードで実行するようにiOSVoIPアプリケーションを構成する

  28. 28

    パラメータ入力でボタンクリック時にストアドプロシージャを実行する方法

  29. 29

    J2MEアプリケーションをバックグラウンドで実行する方法は?

ホットタグ

アーカイブ