Global.asaxで私のDB上でいくつかの非同期操作を呼び出す必要があります。 たとえばApplication_AuthenticateRequestでDBに対してユーザーを認証する必要があります 非同期タスクでは可能ですか?ASP.NET:Global.asaxで非同期タスクを呼び出すことは可能ですか?
答えて
新しいC#キーワードasyncとawaitを使用する方法が見つかりませんでしたが、IHttpAsyncHandlerインターフェイスを実装しているため、APMパターンを使用してGlobal.asaxで非同期操作を使用することができます。ここでは、非同期をデモするための小さなコードですが、ここでは例としてWebRequstを使用します。代わりにデータベース操作を使用してください。
public Global()
{
this.AddOnAuthenticateRequestAsync(BeginGetAsyncData, EndGetAsyncData);
}
IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
Console.WriteLine("BeginGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest request = WebRequest.Create("http://www.google.com");
return request.BeginGetResponse(cb, request); // call database async operation like SqlCommand.BeginExecuteReader()
}
void EndGetAsyncData(IAsyncResult ar)
{
Console.WriteLine("EndGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest requst = (WebRequest)ar.AsyncState;
System.Net.WebResponse response = requst.EndGetResponse(ar); // call database async operation like SqlCommand.EndExecuteReader()
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
response.Close();
}
ありがとう! 私は見つけました:) [http://www.codeproject.com/Articles/373479/Writing-asynchronous-HTTP-Module-in-ASP-NET-4-5](http://www.codeproject。 com/Articles/373479/Writing-Asynchronous-HTTP-Module-in-ASP-NET-4-5) – user1328761
AuthenticateRequestの非同期バージョンを自分で追加する必要があります。
public MvcApplication()
{
// Contrary to popular belief, this is called multiple times, one for each 'pipeline' created to handle a request.
// Wire up the async authenticate request handler.
AddOnAuthenticateRequestAsync(BeginAuthenticateRequest, EndAuthenticateRequest, null);
}
問題は新しい非同期を使用してBeginAuthenticateRequest
とEndAuthenticateRequest
を実装する方法、そしてある/ Cの#の機能を待って次のコードを使用します。まずは、邪魔たAuthenticateRequestの私達の非同期バージョンを取得してみましょう:私たちは次に何をする必要がどのような
private async Task AuthenticateRequestAsync(object sender, EventArgs args)
{
// Yay, let's do async stuff!
await ...
}
はBeginAuthenticateRequestとEndAuthenticateRequestの実装を思い付くています。私はa blog postに従ったが、私の独自の実装を派生:
private IAsyncResult BeginAuthenticateRequest(object sender, EventArgs args, AsyncCallback callback, object state)
{
Task task = AuthenticateRequestAsync(sender, args);
var tcs = new TaskCompletionSource<bool>(state);
task.ContinueWith(_ =>
{
if (task.IsFaulted && task.Exception != null) tcs.TrySetException(task.Exception.InnerExceptions);
else if (task.IsCanceled) tcs.TrySetCanceled();
else tcs.TrySetResult(true);
if (callback != null) callback(tcs.Task);
}, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);
return tcs.Task;
}
あなたはそれがどのように動作するかを確認するために全体のリンク先の記事を読むことができますが、基本的にIAsyncResult
は、タスクによって実装されているので、あなたがしなければならないすべてが終わったときにコールバックを呼び出すことです。
最後のビットが死んで簡単です。今、これを行うための簡単な方法があります
private void EndAuthenticateRequest(IAsyncResult result)
{
// Nothing to do here.
}
:この方法で
public MvcApplication()
{
var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork);
this.AddOnAuthenticateRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
}
private async Task DoAsyncWork(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var ctx = app.Context;
...
await doSomethingAsync();
}
、あなたは非同期キーワードを使用する方法を定義し、そのメソッドをラップ'EventHandlerTaskAsyncHelper'クラスを使用してBeginEventHandlerおよびEndEventHandlerメソッドを生成し、AddOnAuthenticateRequestAsync呼び出しに渡します。
- 1. 非同期タスクを呼び出す
- 2. 同期呼び出し内での非同期タスクの実行
- 3. 非同期タスク - 明確ではないメソッドを呼び出す
- 4. 非同期タスクでif文を呼び出す方法は?
- 5. 応答ネイティブの非同期関数内でリダイレクトするメソッドを呼び出すことは可能ですか?
- 6. クレードルの呼び出しを同期させることは可能ですか?
- 7. 非同期メソッドで待機可能メソッドを呼び出すことはできますか?
- 8. WindowsスクリプトホストでJavaScript関数の非同期呼び出しが可能ですか?
- 9. webserviceを非同期で呼び出す
- 10. 非同期タスクとは、C#、私は非同期Webサービスの呼び出しに取り組んでいます
- 11. Cakeタスク内からpowershellコマンドを呼び出すことは可能ですか?
- 12. WebGLでは、gl.finish()への非同期呼び出しをエミュレートすることが可能です。
- 13. 非同期に非同期デリゲートを呼び出しますか?
- 14. 非同期コードから非同期メソッドを呼び出す
- 15. 別のメソッドを呼び出すサブリストのタスク/非同期ラムダ
- 16. UIスレッドで同期メソッドを非同期で呼び出す
- 17. 異なるデータで同じ非同期タスクを複数呼び出すC#
- 18. powershellコマンドレットを非同期に呼び出すことはできますか?
- 19. 非同期タスクのメソッドを呼び出すと、アプリケーションは終了します
- 20. 非同期呼び出し
- 21. 非同期呼び出しで同期関数をラップする#
- 22. ワークフローでコマンドを呼び出すことは可能ですか?
- 23. 非同期メソッドで非同期呼び出しスタック
- 24. 非同期タスクの可能性
- 25. MQSeries:MCBと非同期で同期ポイント/ロールバックが可能ですか?
- 26. 非同期ライブラリから非同期呼び出しを行う?
- 27. 非同期呼び出しでのハンドルリダイレクト
- 28. 非同期パイプからクラスメソッドを呼び出すことができます
- 29. 非同期タスクの可変スコープとは何ですか?
- 30. Pythonでの同期呼び出しへの非同期呼び出し
なぜ非同期で認証しますか?それは同期して行われてはいけませんか? – Rich
多くのユーザからのリクエストでは、sychronouseがDBへの呼び出しによって他のリクエスタをキューに入れるため、レスポンス時間が長くなります。 [ASP.NET MVC 4のタスクベース非同期プログラミングモデル(TAP)を使用した非同期データベース呼び出し](http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous -programming-model-tap-in-asp-net-mvc-4) – user1328761
AuthenticateRequestを非同期に処理することで、スループットを向上させることができました。スレッドがネットワークによってブロックされる必要はありません。 –