Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用webforms和用户控件的基于任务的编程(TAP)_C#_Asp.net_Ajax_Webforms - Fatal编程技术网

C# 使用webforms和用户控件的基于任务的编程(TAP)

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并等待 在我的用户控件中,我希望在长时间运行的进程继续进行时显示一个进度条 异步在这

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的头

我看不到线程在哪里被阻塞了


我怀疑正在发生的是会话状态正在阻止第二个请求;请参阅的并发请求部分。

@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;
    }