5

私はasp.netとC#にかなり慣れていないので、ご容赦ください。また、これが以前に尋ねられた場合は申し訳ありません... もしそうなら、私を助けになるページに案内してください.

私が持っているもの:

  • ページ:4更新パネル付き

    1. (アイテム)グリッドビュー、ユーザー表示オプション(この質問では重要ではありません)、およびグリッドに表示されるアイテムのリストを返すデータベース検索を実行するボタンを含む1番目のUpdatePanel。ユーザーがこのグリッドで項目を選択...

    2. 2 番目の UpdatePanel には、XML から読み込まれた使用可能なタスクのリストを含むドロップダウン リストが含まれています。ユーザーはタスクを選択します。このタスクは、2 番目の updatepanel の別の (パラメーター) gridview に使用可能なオプション/パラメーター (XML ファイルからも読み込まれる) の束を表示します。ここでの Gridview には、常に 1 行のデータが含まれます。動的コントロールを作成するよりも簡単なので、ここでは gridview を使用しています (パラメーターはタスクごとに異なります)。ユーザーは、パラメーター値をグリッドに入力できます。ユーザーが [追加] ボタンをクリックすると、タスクが 3 番目の更新パネルの別のグリッドビューに追加されます。

    3. 3 番目の UpdatePanel には、ユーザーが追加したすべてのタスクを含む (タスク) グリッドビューが含まれています。すべてのタスクをバッチ実行すると思われるボタンもあります。ボタンをクリックすると、実行する保留中のタスクを探して (タスク) グリッドビューを通過します。保留中のタスクごとに、タスクを適切に処理する Web サービスを呼び出します。Web サービスは、ログ出力とともにタスクの結果を返します。

    4. 4 番目の UpdatedPanel には、Web サービスから返されたログ出力を表示する div のみが含まれています。

さらに取り組みたいのですが、方法がわからないのは次のとおりです。

  • 「非同期」バッチ ジョブを実行するにはどうすればよいですか? 私が達成しようとしているのは、ユーザーがバッチ実行ボタンをクリックすると、バッチジョブが「舞台裏で」実行されている間、3番目の(タスク)更新パネルとそのすべてのコントロールが無効になることです。タスクによっては、各タスクにそれぞれ最大 5 秒かかる場合があります。ユーザーが 60 個のタスクを作成した場合、これによってもページがタイムアウトになると思いますか?
  • バッチ ジョブの実行中、ユーザーは (アイテム) UpdatePanel 内の他のアイテムをさらに検索し、(パラメーター) updatepanel を (タスク) updatepanel に使用して新しいタスクを追加できます。
  • (タスク) UpdatePanel は、ジョブの実行中に「ジョブが進行中です...」というオーバーレイを表示します。

私の質問を理解していただければ幸いです。このタスクに取り組む方法について、誰かが親切にガイダンスや指示を与えることができれば、非常に感謝しています

詳細情報:

フレームワーク 3.5 の使用

Asp.net C# + Ajax の使用

Web サービスは、solaris ボックスの gSoap です

よろしくお願いします。


初心者で申し訳ありません。あなたの助けに返信しようとしていましたが、入力できる文字数が限られていることがわかりました。今のところ、自分のコメントを更新します。

ご提案いただきありがとうございます。返信が遅くなり申し訳ありません。先日いろいろ調べて、「PageAsyncTask」と「IAsyncResult」で動作するようにいくつかの変更を加えました。ページによって呼び出される Web サービス クラスを作成しました。新しい Web サービス クラスは、gSoap Web サービスと呼ばれます。ある種の「非同期」で実行することができました。

私は実行するボタンを持っています:

  protected void StartASyncJob()
  {
     PageAsyncTask task = new PageAsyncTask(
        new BeginEventHandler(BeginAsyncCommandTask),
        new EndEventHandler(EndAsyncCommandTask),
        new EndEventHandler(AsyncCommandTaskTimeOut), null);

     RegisterAsyncTask(task);
  }

BeginAsyncCommandTask はグリッドを通過し、保留中の最初のタスクを取得して Web サービスを呼び出します。

EndAsyncCommandTask は、返された結果を取得し、(ログ) UpdatePanel を書き出します。次に、StartASyncJob() を再度実行して、処理する次の保留中のレコードを探します。

これはすべて、ページで他に何もしない場合にのみ機能します。(非同期プロセスの実行中に) (アイテム) グリッドビューでさらにアイテムを検索したり、(タスク) ドロップダウンリストから新しいタスクを選択したりした場合、非同期 Web サービス プロセスが完了するまでイベントは発生しません。完了すると、ドロップダウン リストまたは検索イベントが発生し、Web サービスから返されたログの詳細が更新されません。

「待機」は、「PageAsyncTask」が同じページスレッドから「生成」されたことが原因だと思いますか?

「非同期」Web サービスを使用すると、ユーザーは一度に複数のことを実行できるようになり、ユーザー エクスペリエンスが向上すると思います。しかし、私が間違っているか、正しく行っていないようです。

QueueUserWorkItem を使用するというあなたの提案は試していません。しかし、その前に、「PageAsyncTask」を使用した場合と同じ効果が得られるかどうかお尋ねしてもよろしいですか。QueueUserWorkItem を使用すると、「同じページ スレッドから生成する」のと同じ効果がありますか?

よろしくお願いします。私のコードを投稿する必要がある場合は、私に知らせてください。

4

1 に答える 1

2

いくつかの解決策がありますが、サーバーをどの程度制御できるかによって異なります。

  1. サーバーへの完全なアクセス制御がある場合は、タスクを処理する別のアプリケーションを作成できます。アプリケーションはWindowsサービスにすることができ、ページとアプリケーション間の通信はデータベースまたはMSMMQのいずれかになります(通信は主にタスクとその状態のリストを意味します-1。実行する、2。実行する3.終了する)。

  2. 別の解決策は、サーバーへの完全なアクセス制御がない場合ですが、スレッド間に何らかの通信を実装する必要があります。ポイント1で説明したアプリケーションを使用する代わりに、次の方法で開始できる別のスレッドを使用できます。

    System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner());
    

    ループ内で既存のタスクのリストを処理するだけのLaunchTaskRunnerというメソッドを実装したとすると、上記の行はそれを別のプロセスで開始します。このメソッド(別のスレッドで実行されている)とは、静的変数(ページで宣言されている)を介して通信できます。例:

    public class YourPage : System.Web.UI.Page{
        static IList<Task> tasks;
        static void LauchTaskRunner(){
        // here make use of tasks variable
        }
    }
    

    (tasks)updatepanelが更新されるたびに、tasks変数に基づいてレンダリングする必要があります。

于 2012-12-16T13:11:45.387 に答える