在ASP.NET中查询Google Big Query结果时调用Thread.Sleep是否合适?备择方案?

时间:2015-05-06 11:44:12

标签: 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;
            }
        }

看一下这段代码,有人可以告诉我在这个上下文中调用Thread.Sleep是否合适,或者我应该不断烧掉CPU周期。

1 个答案:

答案 0 :(得分:5)

我不会在服务器端执行此操作,因为必须小心使用哪些等待调用来避免负载下的高资源消耗。

您的用户也无法从该页面获得任何反馈。您可以通过显示旋转轮来改善这种情况,但最好向用户显示实际进度。

更好的方法是对您的网站进行AJAX调用。呼叫可能会返回状态,已用时间和完成百分比等内容(请查看BigTable的API)。在这种情况下,您不需要执行任何Thread.SleepTask.Delay功夫。

修改
哦,你已经在使用AJAX了!只需撕掉任何Thread.Sleep并立即将结果返回给用户。在浏览器中,当AJAX调用完成时,使用来自AJAX调用的信息更新UI。完成工作。