我正在尝试做我认为应该相对简单的事情,但我的用户界面不会马上更新。
我需要做的是点击按钮时我需要更新标签,说明作业已经开始,启动该作业,然后在作业完成时更新标签。然而,UI总是阻塞,直到工作完成,所以我在等待工作完成时无法做任何事情。关于如何解决这个问题的任何想法?
嘿是我的一些代码:
protected async void TurnOff_Click(object sender, EventArgs e) {
Label1.Text = "Started";
Label1.Text = await Task.Run<string>(() => SimulateData());
}
Private string SimulateData() {
Thread.Sleep(5000); //I have tried other methods that will do work for awhile and not freeze the thread as well (neither work)
return "finished";
}
无论我如何运行,它似乎总是阻塞,直到作业完成然后它将让我用UI做事情。我需要它在作业开始后自动返回,然后在完成后更新UI。
答案 0 :(得分:8)
这只是异步发生服务器端。 Web服务器在向客户端提供任何内容之前仍在等待响应完成。即使这确实按预期工作......你真的期望它能如何工作?它会为您的浏览器提供响应,然后是什么?如何更新已经在您的浏览器中的响应?
为了在客户端和服务器之间进行异步操作,您需要使用AJAX或Web套接字或一些异步通信介质。您描述该过程的方式甚至听起来像一个理想的场景类似SignalR之类的东西,它是一种工具,用于维护浏览器和服务器端代码之间的连接,并通知浏览器服务器端消息。 (如果可用的话,通过网络套接字,或者在必要时它会透明地降级为长轮询等。)