C# 使用webforms和用户控件的基于任务的编程(TAP)
Net 4.5使用web窗体和用户控件的基于任务的异步模式TAP webforms、winforms、WCF和MVC方法之间似乎存在一些微妙的差异。到目前为止,我已经: 在我的 在Web Config:appSettings-add key=aspnet:UseTaskFriendlySynchronizationContext中,这意味着我可以使用任务,而不必在页面中注册它们 没有;这意味着您可以使用async并等待 在我的用户控件中,我希望在长时间运行的进程继续进行时显示一个进度条 异步在这里帮不了你。最简单的方法是使用signar,它内置了对进度更新的支持 我为UI创建了一个Javascript reporter,并将ajax调用到一个伪状态处理器 AJAX是一种合适的替代解决方案 我的Ajax在自定义响应中以%完成作为响应。AppendHeaderProgressStatus,value 我希望您的意思是它发送一个完整的响应,而不仅仅是刷新JavaScript的头 我看不到线程在哪里被阻塞了C# 使用webforms和用户控件的基于任务的编程(TAP),c#,asp.net,ajax,webforms,C#,Asp.net,Ajax,Webforms,Net 4.5使用web窗体和用户控件的基于任务的异步模式TAP webforms、winforms、WCF和MVC方法之间似乎存在一些微妙的差异。到目前为止,我已经: 在我的 在Web Config:appSettings-add key=aspnet:UseTaskFriendlySynchronizationContext中,这意味着我可以使用任务,而不必在页面中注册它们 没有;这意味着您可以使用async并等待 在我的用户控件中,我希望在长时间运行的进程继续进行时显示一个进度条 异步在这
我怀疑正在发生的是会话状态正在阻止第二个请求;请参阅的并发请求部分。@Stephen Cleary感谢您的帮助,我更新了问题。
protected void Page_Load(object sender, EventArgs e)
{
Response.AddHeader("cache-control", "no-cache");
if (!Page.IsPostBack)
{
InitialiseControl();
}
}
public async void InitialiseControl() // Its an event
{
// wait for a command from the ajax
if (Request["startTask"] != null)
{
//..do some progress stuff
await GetUserProfileAsync(request.MembershipNumber);
//..Report back to the UI
}
if (Request["getStatus"] != null)
{
//..polling from the ajax, continue with progress reporting back to the UI
}
}
// we are still in HttpContext.Current so add object to session
private async Task GetUserProfileAsync(string membershipNumber)
{
UserProfile profile =
await WebApplication.Library.Methods.Membership.UserProfile.GetUsersProfileTaskAsync(membershipNumber);
HttpContext.Current.Session["UserProfile_" + membershipNumber] = profile;
}
public async static Task<UserProfile> GetUsersProfileTaskAsync(string usersMembershipNumber)
{
Task<UserProfile> t = new Task<UserProfile>
(
() =>
{
UserProfile profile = new UserProfile() { Name = "Some name",
Password = "TestPassword",
MembershipNumber = usersMembershipNumber };
return profile;
}
);
// start the task
t.Start();
int i = 0;
for (i = 0; i < 8; i++)
{
// Fake delay simulating a web service
Thread.Sleep(1000);
}
if (i == 8)
{
return await t;
}
return null;
}