Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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

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# 异步等待按钮单击始终同步运行_C#_Asp.net_Multithreading_Asynchronous_Async Await - Fatal编程技术网

C# 异步等待按钮单击始终同步运行

C# 异步等待按钮单击始终同步运行,c#,asp.net,multithreading,asynchronous,async-await,C#,Asp.net,Multithreading,Asynchronous,Async Await,我正在学习AsyncWait,并在旧的asp.net中实现它。我使用的是C4.6 现在,页面在添加async Wait后始终同步运行。它正在等待api发回结果,然后在屏幕上显示消息 我要找的是,这个页面启动了一个线程,我可以在上面做其他的事情。完成后,将显示结果 下面是我的按钮单击,HTTP调用,它将启动异步req和API方法 我有 仿效 在StackOverflow和其他论坛上寻找解决方案。我相信我是用同样的方式做的,当然我不是。 在aspx页面上添加了Async=true 按钮点击 prot

我正在学习AsyncWait,并在旧的asp.net中实现它。我使用的是C4.6

现在,页面在添加async Wait后始终同步运行。它正在等待api发回结果,然后在屏幕上显示消息

我要找的是,这个页面启动了一个线程,我可以在上面做其他的事情。完成后,将显示结果

下面是我的按钮单击,HTTP调用,它将启动异步req和API方法

我有

仿效 在StackOverflow和其他论坛上寻找解决方案。我相信我是用同样的方式做的,当然我不是。 在aspx页面上添加了Async=true

按钮点击

protected async void btnCopy_Click(object sender, EventArgs e)
    {
        await RunAsync(Guid.Parse(SourceBusinessID), Guid.Parse(DestinationBusinessID), false);

        if (lblError.Text == "")
        {
            lblError.Text = "Copy Completed!";
        }            
    }

public async Task RunAsync( Guid SourceBusinessID, Guid DestinationBusinessID,bool copyAdviser)
    {
        using (var client = new HttpClient())
        {
            var request = new HttpRequestMessage()
            {
                RequestUri = new Uri("http://localhost:52140/api/DummyAccounts/"),
                Method = HttpMethod.Get,
            };
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

            client.Timeout = TimeSpan.FromSeconds(500);

            var response = await client.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {                    
                lblError.Text = response.StatusCode.ToString();
            }
        }
    }
原料药


任何帮助都将不胜感激

WebForms应用程序中的异步不会使表单的行为像客户端应用程序一样,它位于事件循环中并等待事件发生。它仍然是一个服务器呈现的页面,响应由按钮单击或更改事件触发的单个事务性HTTP请求,并由WebForm提供一个服务器呈现的HTML响应。一旦呈现,页面就完成了。没有等待下一次单击的“事件循环”

WebForms/ASP.NET应用程序中的异步只允许您从主线程卸载一些处理,但它不会更改页面上UI的行为。将异步视为一种方法,可以同时运行多个操作,或者在后台运行较长时间的IO操作时释放主处理线程,然后在呈现最终页面之前返回

但它对页面实际呈现到浏览器中的方式或行为没有任何影响-WebForms页面仍然是一个纯服务器呈现的页面,通过HTTP回发处理事件。就浏览器而言,这是一个事务性请求:您单击一个按钮,页面就会重新呈现,无论您是否在后端使用Async


解决问题的方法是使用客户端JS框架来管理应用程序的异步流,并对服务器进行异步HTTP调用。这将为您提供所需的行为,其中一个长请求可以“在后台”运行,同时让客户端应用程序继续执行其他操作。操作完成后,服务器最终会给您回电话,然后您可以使用响应数据显示结果或通知用户。

我认为您需要这样做:

private void btnCopy_Click (object sender, RoutedEventArgs e)
    {
        Task.Factory.StartNew(async () =>
        {
            await RunAsync (Guid.Parse (SourceBusinessID), Guid.Parse (DestinationBusinessID), false);
            lblError.Dispatcher.Invoke(() => { if (lblError.Text == "") lblError.Text = "Copy Completed!"; });
        });
    }

我想你可能有点困惑。我推荐斯蒂芬·克利里(Stephen Cleary)的作品。谢谢@Damien_,这真的很有帮助。谢谢@Rick,我可能会转向js框架。虽然有一件有趣的事情,但如果我从await RunAsyncGuid.ParseSourceBusinessID中删除await,Guid.ParseDestinationBusinessID,false;在我的按钮点击事件中,然后该方法运行sync,我可以在api在后台工作时执行其他操作。但是当API完成任务时,它会以某种方式杀死主工作进程。然后,我必须重新构建解决方案以重新开始。我不明白我的主工作进程为什么会死掉?你不能删除异步操作上的等待。它仍将运行,但异步运行,而不是等待。您的请求将完成,当Aysnc操作完成它所做的任何事情时,它将发现页面不再存在,然后-BOOM。同样,您需要了解一下异步在服务器上是如何工作的——您混淆了客户端和服务器端的异步功能,在您弄清楚这一点之前,您将遇到问题。
private void btnCopy_Click (object sender, RoutedEventArgs e)
    {
        Task.Factory.StartNew(async () =>
        {
            await RunAsync (Guid.Parse (SourceBusinessID), Guid.Parse (DestinationBusinessID), false);
            lblError.Dispatcher.Invoke(() => { if (lblError.Text == "") lblError.Text = "Copy Completed!"; });
        });
    }