Что ж, ответом на эту проблему является класс "System.Web.UI.PageAsyncTask". Он разрешает асинхронные вызовы задач и ожидает
завершение в том же потоке. Также можно создать несколько задач и выполнить их параллельно. Пожалуйста, ознакомьтесь с документацией
для получения дополнительной информации ... Будет работать в Asp.Net 2.0 и выше.
Для нашей задачи выше ... Я ставлю «Мой алгоритм» как синхронизацию, а обе другие задачи - как асинхронную параллель. Поэтому моя страница займет 10 + 5
= 15 секунд для загрузки.
public partial class MyWebPage : System.Web.UI.Page
{
WebServiceI WebServiceIObject = new WebServiceI();
WebServiceII WebServiceIIObject = new WebServiceII();
protected void Page_Load(object sender, EventArgs e)
{
PageAsyncTask PAT_I = new PageAsyncTask
(BeginGetWebServiceISomeMethodResult, OnEndGetWebServiceISomeMethodResult, null, null, true);
Page.RegisterAsyncTask(PAT_I);
PageAsyncTask PAT_II = new PageAsyncTask
(BeginGetWebServiceIISomeMethodResult, OnEndGetWebServiceIISomeMethodResult, null, null, true);
Page.RegisterAsyncTask(PAT_II);
Page.ExecuteRegisteredAsyncTasks();
/* My Algorithm 5 seconds*/
DataSet DS = GetDataSetFromSomeWhere();
MyGataGrid.DataSource = DS.tables[0];
MyGataGrid.DataBind();
/* My Algorithm 5 seconds*/
}
IAsyncResult BeginGetWebServiceISomeMethodResult
(object Sender, EventArgs EventArgsObject,
AsyncCallback AsyncCallbackObject, object PassAnythingExtraIfRequired)
{
return WebServiceIObject.BeginSomeMethod(AsyncCallbackObject, PassAnythingExtraIfRequired);
}
IAsyncResult BeginGetWebServiceIISomeMethodResult
(object Sender, EventArgs EventArgsObject,
AsyncCallback AsyncCallbackObject, object PassAnythingExtraIfRequired)
{
return WebServiceIIObject.BeginSomeMethod(AsyncCallbackObject, PassAnythingExtraIfRequired);
}
void OnEndGetWebServiceISomeMethodResult(IAsyncResult asyncResult)
{
string WebServiceISomeMethodResult = WebServiceIObject.EndSomeMethod(asyncResult);
MyLabelI.Text = WebServiceISomeMethodResult;
}
void OnEndGetWebServiceIISomeMethodResult(IAsyncResult asyncResult)
{
string WebServiceIISomeMethodResult = WebServiceIIObject.EndSomeMethod(asyncResult);
MyLabelII.Text = WebServiceIISomeMethodResult;
}
}
Работает :) Код можно сделать общим с помощью общего рефакторинга ...
Пожалуйста, будьте осторожны при планировании такого рода дизайна, хотя ... Внутренне это также должно использовать потоки из пула потоков
только ... Я не копался глубоко .. но должно быть .. Так что, если задачи занимают больше времени, чем планировалось, и если несколько таких задач
подняться в то же время, тогда веб-сервер может пострадать, и пользователи могут получить время ...
Я все еще продолжаю продвигаться вперед, несмотря на вышеуказанный недостаток, так как мои пользователи все равно будут иметь тайм-аут, если 25 секунд окажутся 55
секунд ... Лучше иметь ситуацию, когда некоторые пользователи могут работать, а не никто ..
Если есть лучшая альтернатива, пожалуйста, напишите.