C# Windows.Web.Http.HttpClient.getAsync(uri)正在挂起应用程序,而不是取消

C# Windows.Web.Http.HttpClient.getAsync(uri)正在挂起应用程序,而不是取消,c#,windows-phone-8.1,async-await,C#,Windows Phone 8.1,Async Await,我已经在这个问题上纠缠了几个小时,我一辈子都搞不清楚:( 因此,我使用一个HttpClient来访问一个托管在我的应用程序中使用的web站点上的XML文件 我尝试了CancellationTokens,但没有任何效果,无法找到进一步调试此问题的方法 我的职能如下: public static async Task<string> GetXML() { string xml = string.Empty; Uri url = new Uri("http:/blabla.

我已经在这个问题上纠缠了几个小时,我一辈子都搞不清楚:(

因此,我使用一个HttpClient来访问一个托管在我的应用程序中使用的web站点上的XML文件

我尝试了CancellationTokens,但没有任何效果,无法找到进一步调试此问题的方法

我的职能如下:

public static async Task<string> GetXML()
{
    string xml = string.Empty;
    Uri url = new Uri("http:/blabla.com/CompanyAppsManifest.xml");
    HttpClient hCli = new HttpClient();
    CancellationTokenSource cts = new CancellationTokenSource(7000);
    hCli.DefaultRequestHeaders.TryAppendWithoutValidation("Accept-Encoding", "UTF-8");
    hCli.DefaultRequestHeaders.TryAppendWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml, charset=utf-8, text/xml");
    try
    {
        var response = await hCli.GetAsync(url).AsTask(cts.Token);
        if (response.IsSuccessStatusCode == true)
        {
            xml = response.Content.ToString();
            hCli.Dispose();
            return xml;
        }
        else
        {
            hCli.Dispose();
            MessageBox.Show("Contact the admin with this info: SC: " + response.StatusCode.ToString() + " Content: " + response.Content.ToString());
            if (Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                Debugger.Break();
            }
            xml = "Operation failed due to: HTTP Failure";
            return xml;
        }
    }
    catch (OperationCanceledException)
    {
        MessageBox.Show("Operation failed to complete in a timely fashion, please ensure you have WiFi active or a stable data connection");
        xml = "Operation failed due to timeout";
        return xml;
    }
    catch (Exception ex)
    {
        MessageBox.Show("error" + ex.Message + " : " + ex.InnerException.Message);
        xml = "Operation failed due to exception";
        return xml;
    }
    finally
    {
        cts = null;
    }
}
谁能告诉我为什么

1:取消令牌没有像我所看到的所有示例中那样起作用。我不知道哪里出了问题

2.它似乎只在第一次运行时冻结应用程序,如果第一次运行时应用程序冻结,然后关闭应用程序并重新启动,则getAsync方法运行正常,程序按预期运行

任何帮助或建议将不胜感激,因为我找不到任何进一步的帮助:(

听起来很像这个问题:

我会提供任何额外的信息,只需在下面的评论

谢谢

取消令牌在所有情况下似乎都不起作用 我一直在看的例子,我不知道我要去哪里 错

它不会工作,因为你的应用程序会死锁。我甚至不确定它第二次是如何运行的。使用
。Result
阻止异步方法会导致死锁。此外,你需要使用
GetAsync
重载,该重载使用
取消令牌
。请注意,即使你确实传递了令牌,如果此死锁,它也不会发生rk

var response = await hCli.GetAsync(url, cts.Token).AsTask(cts.Token);
它似乎只在第一次运行时冻结应用程序,如果 第一次运行时冻结,然后关闭应用程序并 重新启动它,getAsync方法运行正常,程序运行正常 预料之中

我不确定这怎么可能。如果你从UI线程调用它,每次都会死锁


。相反,让它自然地在您的代码库中流动。如果您的方法不能使用
async wait
,并且必须阻止,请使用同步API。如果WP上没有同步API,那么您需要重新考虑您正在做的事。

很可能是由于以下原因导致的死锁。
var response = await hCli.GetAsync(url, cts.Token).AsTask(cts.Token);