11

async voidASP.NET Web フォーム ページでメソッドを正常に使用しました。ただし、Web ユーザー コントロールで同じメソッドを使用してから、この Web ユーザー コントロールをasync="true"設定のあるページに配置しようとすると、次のエラーが発生し続けます。

現在、非同期操作を開始できません。非同期操作は、非同期ハンドラーまたはモジュール内で、またはページ ライフサイクルの特定のイベント中にのみ開始できます。ページの実行中にこの例外が発生した場合は、ページが <%@ Page Async="true" %> とマークされていることを確認してください。

問題は、void asyncメソッドを Web ユーザー コントロールで使用して、非同期対応の Web フォーム ページに埋め込むことができるかということです。

4

1 に答える 1

10

コントロールがページ上にある場合は、非同期メソッドを呼び出すことができます。以下の例を参照してください。

ページ.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page.aspx.cs" Inherits="AsyncDEmo.Page" Async="true" %>

<%@ Register Src="~/Control.ascx" TagPrefix="uc1" TagName="Control" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <uc1:Control runat="server" id="Control" />
    </form>
</body>
</html>

Page.aspx の分離コードが空です

コントロール.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control.ascx.cs" Inherits="AsyncDEmo.Control" %>

<span id="TaskMessage" runat="server">
      </span>

コードビハインドの制御

protected void Page_Load(object sender, EventArgs e)
    {
        // Define the asynchronuous task.
        Samples.AspNet.CS.Controls.SlowTask slowTask1 =
          new Samples.AspNet.CS.Controls.SlowTask();
        Samples.AspNet.CS.Controls.SlowTask slowTask2 =
        new Samples.AspNet.CS.Controls.SlowTask();
        Samples.AspNet.CS.Controls.SlowTask slowTask3 =
        new Samples.AspNet.CS.Controls.SlowTask();

        PageAsyncTask asyncTask1 = new PageAsyncTask(slowTask1.OnBegin, slowTask1.OnEnd, slowTask1.OnTimeout, "Async1", true);
        PageAsyncTask asyncTask2 = new PageAsyncTask(slowTask2.OnBegin, slowTask2.OnEnd, slowTask2.OnTimeout, "Async2", true);
        PageAsyncTask asyncTask3 = new PageAsyncTask(slowTask3.OnBegin, slowTask3.OnEnd, slowTask3.OnTimeout, "Async3", true);

        // Register the asynchronous task.
        Page.RegisterAsyncTask(asyncTask1);
        Page.RegisterAsyncTask(asyncTask2);
        Page.RegisterAsyncTask(asyncTask3);

        // Execute the register asynchronous task.
        Page.ExecuteRegisteredAsyncTasks();

        TaskMessage.InnerHtml = slowTask1.GetAsyncTaskProgress() + "<br />" + slowTask2.GetAsyncTaskProgress() + "<br />" + slowTask3.GetAsyncTaskProgress();
    }

SlowClass.cs

public class SlowTask
{
    private String _taskprogress;
    private AsyncTaskDelegate _dlgt;

    // Create delegate. 
    protected delegate void AsyncTaskDelegate();

    public String GetAsyncTaskProgress()
    {
        return _taskprogress;
    }
    public void ExecuteAsyncTask()
    {
        // Introduce an artificial delay to simulate a delayed  
        // asynchronous task.
        Thread.Sleep(TimeSpan.FromSeconds(5.0));
    }

    // Define the method that will get called to 
    // start the asynchronous task. 
    public IAsyncResult OnBegin(object sender, EventArgs e,
        AsyncCallback cb, object extraData)
    {
        _taskprogress = "AsyncTask started at: " + DateTime.Now + ". ";

        _dlgt = new AsyncTaskDelegate(ExecuteAsyncTask);
        IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);

        return result;
    }

    // Define the method that will get called when 
    // the asynchronous task is ended. 
    public void OnEnd(IAsyncResult ar)
    {
        _taskprogress += "AsyncTask completed at: " + DateTime.Now;
        _dlgt.EndInvoke(ar);
    }

    // Define the method that will get called if the task 
    // is not completed within the asynchronous timeout interval. 
    public void OnTimeout(IAsyncResult ar)
    {
        _taskprogress += "AsyncTask failed to complete " +
            "because it exceeded the AsyncTimeout parameter.";
    }
}
于 2013-03-26T21:25:39.820 に答える