use*_*567 1 c# asp.net asp.net-mvc async-await google-bigquery
我正在使用ASP.NET MVC 5,它从Google Big Query获取数据.由于Google Big Query的设计方式,如果作业未完成,我需要轮询结果.这是我的代码,
var qr = new QueryRequest
{
Query = string.Format(myQuery, param1, param2)
};// all params are mine
var jobs = _bigqueryService.Jobs;
var response = await jobs.Query(qr, _settings.GoogleCloudServiceProjectId).ExecuteAsync();
var jobId = response.JobReference.JobId;
var isCompleted = response.JobComplete == true;
IList<TableRow> rows = response.Rows;
while (!isCompleted)
{
var r = await jobs.GetQueryResults(_settings.GoogleCloudServiceProjectId, jobId).ExecuteAsync();
isCompleted = r.JobComplete == true;
if (!isCompleted)
{
Thread.Sleep(100);
}
else
{
rows = r.Rows;
}
}
Run Code Online (Sandbox Code Playgroud)
看看这段代码,有人可以告诉我在这个上下文中调用Thread.Sleep是否好,或者我应该不断地烧掉CPU周期.
我不会在服务器端执行此操作,因为必须小心哪些等待调用以避免负载下的高资源消耗.
您的用户也无法从该页面获得任何反馈.您可以通过显示旋转轮来改善这种情况,但最好向用户显示实际进度.
更好的方法是对您的网站进行AJAX调用.调用可能会返回状态,已用时间和完成百分比等内容(请查看BigTable的API).在这种情况下,你不需要做任何功夫Thread.Sleep或Task.Delay功夫.
编辑:
哦,你已经在使用AJAX了!只需撕掉任何Thread.Sleep并立即将结果返回给用户.在浏览器中,当AJAX调用完成时,使用来自AJAX调用的信息更新UI.任务完成.