15

Global.asax の DB でいくつかの非同期操作を呼び出す必要があります。たとえば、Application_AuthenticateRequest では、DB に対してユーザーを認証する必要があります 非同期タスクで可能ですか?

4

3 に答える 3

31

これを行う簡単な方法があります。

    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();
    }

このアプローチでは、async キーワードを使用してメソッドを定義し、'EventHandlerTaskAsyncHelper' クラスを使用してそのメソッドをラップして、AddOnAuthenticateRequestAsync 呼び出しに渡す BeginEventHandler メソッドと EndEventHandler メソッドを生成します。

于 2014-03-15T14:02:21.847 に答える
2

C# の新しいキーワード async と await を使用する方法は見つかりませんでしたが、IHttpAsyncHandler インターフェイスが実装されているため、APM パターンを使用して Global.asax で非同期操作を使用できます。これは非同期をデモするための小さなコードです。ここでは例として WebRequest を使用します。この場合は、代わりにデータベース操作を使用してください。

    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();
    }
于 2012-06-20T02:24:12.973 に答える