2017-09-25 94 views
0

NewbieQ:C#の非同期に疑問を抱いては/私は今、タイムアウトエラーが発生完了までに時間がかかりすぎているサーバー・サイドのAjaxリクエストハンドラを持って サーバー側のベストプラクティス

を待っています。

public bool Run(Guid jobId) // returns true if successful in running jobId 

ジョブが重要場合には、交互にIOはその後、CPUバインドバインドされている一連の操作を実行します:

ハンドラは、メソッドを呼び出します。

理想的には、Runを起動し、実行のステータスを随時照会してから、結果(Runが返すbool)を取得できるようにしたいと考えています。

これを行うためのサーバー側のコードを書くときのベストプラクティスは何ですか?

このようにラッパーを記述できますか?

public async Task<bool> RunAsync(Guid jobId) {...} 

もしそうなら、それはどのように非同期実行を呼び出しますか?

Runメソッドを完全に書き直す必要はありますか?最終的には、私はこれをajaxリクエストハンドラから呼び出しているので、仕事の結果を返すか、リクエストを変更して仕事を開始してから、時々クエリーを実行して{bool resultReady、ブール?結果}またはそのような構造体。

+0

async/awaitは、複数のプロセスが並行して実行できる場合に役立ちます。これが実行中でタイムアウトしている単一のプロセスであれば、async/awaitは役に立ちません。この作業を開始するための通知を受け取る、コンソールアプリケーションなどの別のプロセスを持つ必要があるように思えます。コンソールアプリケーションはWebリクエストのようにタイムアウトしませんが、結果をポーリングする必要があります。また、IIS/ASP.NETがタイムアウトするまでの時間を増やす方法もあります.https://stackoverflow.com/questions/2414441/how-to-increase-request-timeout-in-iis – ps2goat

+0

わかりましたが、これは他のユーザーがいる他のユーザーがいるWebサービス上で実行されています。実際にこのタスクを依頼したユーザーでも、結果を待つ間に他の操作を実行する可能性があります。私の本当の懸念は、Webサービス自体がタスクが同期タスクとして完了するのを待っていることです。 –

+0

@ ps2goatそれはちょうど真実ではありません。 'await'は非同期操作を管理するのに便利です。これらの業務が並行して作業を行っているかどうかは関係ありません。 – Servy

答えて

1

あなたが本当に欲しいのは、単純で特異な方法で行うことができないものです。実際には、キュー内の特定のメッセージのステータスを確認できるキューイングシステムが必要です。基本的には、キュー(MSMQなど)に何かをドロップするメソッドと、与えられたjobIdのステータスを返すメソッドがあります。

1

ハングファイアを調べることができます。また、イベントハンドラを使用してクライアントに通知するために、長時間実行されている処理が起こる可能性もあります。

関連する問題