gpt4 book ai didi

c# - xamarin 表单中的异步 Task 问题

转载 作者:行者123 更新时间:2023-11-30 19:38:38 25 4
gpt4 key购买 nike

我正在尝试在 visual studio 2013 上的 xamarin 共享项目中将 Azure 媒体服务与 REST api 结合使用。这是我用来获取访问 token 的代码。

public HttpFactory()
{
string token = GetToken(serviceURI).Result;
//some more methods also async tasks
}

private async Task<string> GetToken(Uri serviceUri)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceURI);
request.Accept = "application/json";
request.Method = "GET";
request.Headers["Host"] = "media.windows.net";
request.Headers["x-ms-version"] = "2.9";
request.Headers["Authorization"] = "Bearer " + token;
var response = (HttpWebResponse) await request.GetResponseAsync();

if (response.StatusCode == HttpStatusCode.MovedPermanently)
{
serviceURI = new Uri(response.Headers["Location"]);
HttpWebRequest req = ( HttpWebRequest)WebRequest.Create(serviceURI);
var res = (HttpWebResponse)await req.GetResponseAsync();

using (Stream responseStream = res.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
{
string str = reader.ReadToEnd();
// var test = JsonConvert.DeserializeObject(str);
JToken jtoken = JsonConvert.DeserializeObject<JToken>(str);
return jtoken["access_token"].Value<string>();

}
}
}
return "";
}

但是当编译器到达-

var response = (HttpWebResponse) await request.GetResponseAsync();

它跳过了其余的代码,我从来没有得到响应。我知道代码正在运行 - 因为它在没有任务的情况下在 async void 方法中运行良好。

有谁知道如何解决这个问题,还是我做错了什么?我也在 vs2015 中尝试过这个,但它是一样的。

最佳答案

您在 UI 线程上遇到了死锁。

当需要完成异步方法时,您使用 Task.Result 阻塞了线程,该异步方法将完成它正在等待的任务。

这就是为什么你不应该在异步代码上同步阻塞。您应该等待从 GetToken 返回的任务:

string token = await GetToken(serviceURI);

如果您不能在该方法中使用异步,请将该逻辑移动到不同的方法(例如 OnLoad 事件处理程序)。

另一种解决方案是在 GetResponseAsync 任务上使用 ConfigureAwait,这样该方法的其余部分就不会在 UI 线程上运行,从而避免了死锁:

var response = (HttpWebResponse) await request.GetResponseAsync().ConfigureAwait(false);

关于c# - xamarin 表单中的异步 Task<T> 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31959475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com