【问题标题】:httpRequest temporarily freezes my applicationhttpRequest 暂时冻结了我的应用程序
【发布时间】:2012-08-14 16:23:09
【问题描述】:

好的,在我继续之前,让我声明我的背景是网络脚本;所以应用程序对我来说很陌生。我对 .NET 知之甚少,而且我的知识有限。

无论如何,在我的应用程序中,我有一个 OAuth httpRequest。请求本身运行良好,它从 Web API 获取我需要的数据。但是,问题是每当我单击激活请求的按钮时,我的程序都会冻结几秒钟,直到请求完成。我还有另一个请求,它每 60 秒自动完成一次。这当然意味着每 60 秒,我的程序就会冻结几秒钟。如何解决这个问题?

    private string twitchCallAPI(string accessKey, string accessSecret, string endpointURI, string httpMethod)
    {
        OAuthHttpWebRequest httpRequest = new OAuthHttpWebRequest();
        httpRequest.ConsumerToken = new OAuthToken { Token = this.twitchConKey, TokenSecret = this.twitchConSecret };
        httpRequest.Token = new OAuthToken() { Token = accessKey, TokenSecret = accessSecret };
        httpRequest.SetUri(endpointURI);
        httpRequest.Method = httpMethod;

        try
        {
            using (var response = httpRequest.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        catch (WebException ex)
        {
            using (var reader = new StreamReader(ex.Response.GetResponseStream()))
            {
                System.Windows.MessageBox.Show(reader.ReadToEnd());
            }
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.ToString());
        }

        return string.Empty;
    }

【问题讨论】:

    标签: c# .net wpf oauth httprequest


    【解决方案1】:

    您可以使用background worker

    【讨论】:

    • 注意:这仅适用于“我还有另一个请求,它每 60 秒自动完成一次。”部分。
    • 谢谢,我能够让这个方法工作......即使点击部分。我只是让点击方法激活了工作人员。
    【解决方案2】:

    简而言之,在任务中进行请求并使用 UI 同步上下文更新 UI 线程

    TaskFactory.StartNew(()=>
    {
        //do web request
    })
    .ContinueWith(() =>
    {
        this.TextBlock1.Text = "Complete"; 
    }, TaskScheduler.FromCurrentSynchronizationContext());
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用异步方法,即使用不同的线程来等待请求的响应。它是您可以探索的解决方案。

      http://msdn.microsoft.com/en-us/library/86wf6409%28v=vs.100%29.aspx

      【讨论】:

      • 嗯,我用我的代码更新了我的第一篇文章......你能更深入地了解我如何让我的代码异步吗?
      • 您的目标/使用的是哪个版本的 .Net?
      【解决方案4】:

      你可以使用 await 关键字:

      private async void OnButtonClick()
      {
         TextBox.Text = await twitchCallAPIAsync(accessKey, accessSecret, endpointURI, httpMethod);
      }
      

      【讨论】:

        【解决方案5】:

        这主要是因为您的应用程序正在等待您启动的方法完成。您必须看看“异步”概念。

        执行“异步”方法的程序会继续其工作流程,并且不会等待该方法产生结果。

        【讨论】:

        • 嗯,我用我的代码更新了我的第一篇文章......你能更深入地了解我如何使我的代码异步吗?
        • 我认为自己没有足够的经验来教你这个概念。这不是这样做的地方。我能给你的唯一建议是你需要阅读一些关于“异步”概念的材料。您应该从 MSDN 开始使用 IAsyncResult。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多