Как отлаживать асинхронные вызовы в .NET?

Рейтинг: 1Ответов: 2Опубликовано: 17.04.2011

Дело в том, что я сталкивался с этим чуть чаще, чем никогда, но когда пришлось, то почему-то никак. В общем есть одна функция в Silverlight

private void button1_Click(object sender, RoutedEventArgs e)
{
    Uri mainpage = new Uri("http://192.168.1.101:3000/");
    HttpWebRequest _webrequest;
    _webrequest = (HttpWebRequest)HttpWebRequest.Create(mainpage);
    RequestState rstate = new RequestState();
    rstate.request = _webrequest;
    try
    {
        IAsyncResult result = (IAsyncResult)_webrequest.BeginGetResponse(new AsyncCallback(RespCallback), rstate);
        allDone.WaitOne();
        // Release the HttpWebResponse resource.
        rstate.response.Close();
    }
    catch (WebException wee)
    {
        MessageBox.Show("\nException raised!\n" + "Message: " + wee.Message + "\nStatus: " + wee.Status +
        "\n", "Error!", MessageBoxButton.OKCancel);
    }
    catch (Exception ee)
    {
        MessageBox.Show("\nException raised!\n" + "Message: " + ee.Message +
        "\n", "Error!", MessageBoxButton.OKCancel);
    }
}

allDone.WaitOne(); ждёт, когда асинхронный вызов завершится. Но на этой стадии программа подвисает, видимо потому что в вызове ошибка. Чтобы их выявить я расположил в функции RespCallbackточки останова, но на них программа никогда не останавливается почему-то.

Update

Я понял что асинхронная функция вообще не запускается, то есть запускается когда уже основная (которая её запускает) завершится. То есть только после того как отработают allDone.WaitOne(); и rstate.response.Close();. Но это не происходит потому что allDone.WaitOne() ждёт флага, который устанавливается при завершении вызова RespCallback

Ответы

▲ 1Принят

Перенестие ваш код в BackgroundWorker и проблема должна исчезнуть.

▲ 1

Я так понял, allDone.WaitOne(); блокирует текущий поток до тех пор, пока асинхронный вызов не завершится. После этого точка останова на том методе, который был вызван асинхронно, не отработает, так как метод уже завершился. Освобождать ресурсы нужно в том методе, который Вы вызываете асинхронно, а не в вызывающем. Сейчас Ваш код работает аналогично тому, как если бы он работал синхронно, только сжирает некоторую часть дополнительных ресурсов на организацию асинхронного вызова.