【问题标题】:Is it good to call Thread.Sleep during polling Google Big Query results in ASP.NET? Alternatives?在 ASP.NET 中轮询 Google Big Query 结果时调用 Thread.Sleep 好不好?备择方案?
【发布时间】:2015-05-10 18:30:27
【问题描述】:

我正在使用从 Google Big Query 获取数据的 ASP.NET MVC 5。由于 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 周期。

【问题讨论】:

  • 没有。使用Task.Delay(),这样您就不会因捆绑线程而扼杀可伸缩性。
  • @Crowcoder 你能不能通过更新我的代码来回答这个问题。
  • @Crowcoder 你的意思是await Task.Delay(100);
  • 是的,等待。这将需要一些重构。如果我现在有时间,我会写一个答案,但 Google 和 Stephen Cleary 会帮助你。 blog.stephencleary.com/2012/02/async-and-await.html

标签: c# asp.net asp.net-mvc async-await google-bigquery


【解决方案1】:

我不会在服务器端这样做,因为必须小心使用哪些等待调用以避免负载下的高资源消耗。

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

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

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

【讨论】:

  • 我在 Ajax BTW 上这样做。
  • 同意,更好的客户端
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2019-11-02
  • 2019-05-16
  • 2021-08-22
相关资源
最近更新 更多