在轮询 Google 大查询结果 ASP.NET 期间调用 Thread.Sleep 好吗?备择方案?
Is it good to call Thread.Sleep during polling Google Big Query results in ASP.NET? Alternatives?
我正在使用 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;
}
}
看看这段代码,有人可以告诉我在这个上下文中调用 Thread.Sleep 是否好,或者我应该连续燃烧 CPU 个周期。
我不会在服务器端执行此操作,因为必须小心使用哪些等待调用以避免负载下的高资源消耗。
您的用户也没有从该页面获得任何反馈。您可以通过显示纺车来改善这种情况,但向用户显示实际进度可能会更好。
更好的方法是 AJAX 调用您的网站。该调用可能 return 诸如状态、已用时间和完成百分比之类的内容(查看 BigTable 的 API)。在这种情况下,您不需要做任何 Thread.Sleep
或 Task.Delay
功夫。
编辑:
哦,您已经在使用 AJAX!只需立即将任何 Thread.Sleep
和 return 结果撕下给用户。在浏览器中,当 AJAX 调用完成时,使用来自 AJAX 调用的信息更新 UI。工作完成。
我正在使用 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;
}
}
看看这段代码,有人可以告诉我在这个上下文中调用 Thread.Sleep 是否好,或者我应该连续燃烧 CPU 个周期。
我不会在服务器端执行此操作,因为必须小心使用哪些等待调用以避免负载下的高资源消耗。
您的用户也没有从该页面获得任何反馈。您可以通过显示纺车来改善这种情况,但向用户显示实际进度可能会更好。
更好的方法是 AJAX 调用您的网站。该调用可能 return 诸如状态、已用时间和完成百分比之类的内容(查看 BigTable 的 API)。在这种情况下,您不需要做任何 Thread.Sleep
或 Task.Delay
功夫。
编辑:
哦,您已经在使用 AJAX!只需立即将任何 Thread.Sleep
和 return 结果撕下给用户。在浏览器中,当 AJAX 调用完成时,使用来自 AJAX 调用的信息更新 UI。工作完成。