0

さて、先に進む前に、私のバックグラウンドは Web スクリプトであるということを述べさせてください。そのため、アプリケーションは私にとって非常になじみのないものです。私は .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;
    }
4

5 に答える 5

3

バックグラウンドワーカーを使用できます

于 2012-08-14T07:57:37.090 に答える
2

簡単に言えば、タスクでリクエストを行い、UI同期コンテキストでUIスレッドを更新します

TaskFactory.StartNew(()=>
{
    //do web request
})
.ContinueWith(() =>
{
    this.TextBlock1.Text = "Complete"; 
}, TaskScheduler.FromCurrentSynchronizationContext());
于 2012-08-14T07:59:33.823 に答える
1

非同期メソッドを使用してみることができます。つまり、別のスレッドを使用してリクエストの応答を待つことができます。あなたが探求できるその解決策。

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

于 2012-08-14T07:56:27.280 に答える
1

await キーワードを使用できます。

private async void OnButtonClick()
{
   TextBox.Text = await twitchCallAPIAsync(accessKey, accessSecret, endpointURI, httpMethod);
}
于 2012-08-14T08:23:09.443 に答える
0

これの主な理由は、アプリケーションが起動するメソッドが終了するのを待っているためです。「非同期」の概念を確認する必要があります。

'async'メソッドを実行するプログラムはワークフローを続行し、メソッドが結果を生成するのを待ちません。

于 2012-08-14T07:57:29.213 に答える