Ответ никогда не заканчивается на PageAsyncTask?

1

Я должен поддерживать старый проект, который использует PageAsyncTask с webforms vs2010 fw4.

Однако этот простой код выполняет компиляцию + execute (нет ошибок в режиме отладки/режиме трассировки), но ответ никогда не заканчивается.

Глядя в режим отладки + точки останова - он достигает всех этапов кода.

public partial class _Default2 : System.Web.UI.Page
{
 IAsyncResult BeginGetData(object sender, EventArgs e, AsyncCallback callback, object state)
    {
        SqlConnection con = new SqlConnection(@"Data Source=... Asynchronous Processing=True;");
        var sql = @"   SELECT   [NAME] FROM [WebERP].[dbo].[t]";
        {
            SqlCommand _cmd = null;
            try
            {
                _cmd = new SqlCommand(sql, con);
                _cmd.CommandTimeout = 100000;
                con.Open();
                return _cmd.BeginExecuteReader(EndGetData, _cmd);

            }
            catch (Exception ex)
            {
                if (_cmd != null) _cmd.Dispose();
                con.Close();
                throw;
            }
        }
    }

    void EndGetData(IAsyncResult ar)
    {
        (ar.AsyncState as SqlCommand).EndExecuteReader(ar);
        Response.Write(1111); // HttpContext.Current.Response also doesnt help
    }

    void TimeoutData(IAsyncResult ar)
    {
        Response.Write("Could not retrieve data!");
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        PageAsyncTask task = new PageAsyncTask(BeginGetData, EndGetData, TimeoutData, null, true);
        Page.RegisterAsyncTask(task);
        Page.ExecuteRegisteredAsyncTasks();    
    }
}

Вопрос

Ответ никогда не заканчивается. Все, что я вижу, это:

Изображение 174551

Что мне не хватает?

(nb Async="true" находится в директиве страницы, а также - код был упрощен только для описания случая)

  • 0
    Я не думаю, что вы должны передавать один и тот же EndGetData как BeginExecuteReader и PageAsyncTask .
  • 1
    @Noseratio ой .... спасибо. наверное пропустил это. правильная строка должна быть return _cmd.BeginExecuteReader(callback(!!!!), state); где обратный вызов объявлен в IAsyncResult BeginGetData(object sender, EventArgs e, AsyncCallback callback, object state)
Теги:
asynchronous
.net-4.0

1 ответ

1
Лучший ответ

Я думаю, проблема здесь в том, что вы передаете одни и EndGetData обратные вызовы BeginGetData и EndGetData как BeginExecuteReader и new PageAsyncTask(). Они должны быть разными: то, что вы переходите в PageAsyncTask является "внешним" для того, что вы передаете BeginExecuteReader.

Вы вызываете BeginExecuteReader из BeginExecuteReader обратного вызова, который вы передадите на PageAsyncTask, и вам действительно нужно было бы вызвать AsyncCallback callback предоставленный вам там ASP.NET (вы бы назвали его, когда операция async завершилась, т.е. от вашего EndGetData).

Было бы намного проще, если бы вы использовали PageAsyncTask(Func<Task>) параметра PageAsyncTask(Func<Task>), но я не думаю, что вы можете нацелить.NET 4.5 на VS2010.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню