C# 沙马林
我正在尝试开发我的第一个Xamarin应用程序 我有两个Web服务类: RestClient:它发出请求并获取json字符串 Helper类:它应该获取Json字符串并将其反序列化为对象类型 我知道C# 沙马林,c#,android,xamarin,C#,Android,Xamarin,我正在尝试开发我的第一个Xamarin应用程序 我有两个Web服务类: RestClient:它发出请求并获取json字符串 Helper类:它应该获取Json字符串并将其反序列化为对象类型 我知道Wait方法不是最好的选择,但我尝试了很多不同的建议版本,但都不起作用。每次尝试都以僵局告终。每个线程都在后台工作。如何将数据返回到UI 我的RestClient类的代码: class RestClient { public static string base_url = @"our Re
Wait
方法不是最好的选择,但我尝试了很多不同的建议版本,但都不起作用。每次尝试都以僵局告终。每个线程都在后台工作。如何将数据返回到UI
我的RestClient类的代码:
class RestClient
{
public static string base_url = @"our Restservice address";
// public string completeUrl { get; set; }
HttpClient client;
public RestClient()
{
client = new HttpClient();
client.BaseAddress = new Uri(base_url);
//client.MaxResponseContentBufferSize = 256000;
}
public async Task<String> GetData(string endpoint)
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(endpoint);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
return result;
}
else
{
return null;
}
}
.Wait()
比“不是最佳选项”更糟糕-它会在任何具有同步上下文的环境中主动导致循环等待。阅读更多细节
如果必须调用此函数来正确初始化对象,则可以使用异步工厂方法或其他方法。Task.Run(loadSupplier.Wait()代码>将解决您的问题。
您的死锁是由异步方法试图在调用线程上执行continuation引起的,但调用线程被阻塞,直到该异步方法完成。可能是Wait()
导致此死锁。由于不能使构造函数异步,所以认为等待可以使其工作。不,更改逻辑(例如,如果(sub==null)等待loadSupplier()
),您可以将代码移动到AccountViewModel的异步方法。您好,欢迎使用Stackoverflow!我建议你在这里走捷径(并获得第一枚徽章)。另外,为了提高获得有用答案的机会,请检查以及如何创建。不,这是完全错误的-。这是有效的。那怎么了?因为有人写了一篇博文说我不应该?如果我需要怎么办?像我实现的遗留同步接口?运行包装你的错误异步代码,这样你就可以阻止它。当然你最好不要在ctor中这样做,但这不是问题所在。提供一些解决方案
public SupplierHelper()
{
}
public async Task<Suppliers> getData()
{
RestClient restClient = new RestClient();
string result = await restClient.GetData("suppliers/13");
return JsonConvert.DeserializeObject<Suppliers>(result);
}
public class AccountViewModel : BaseViewModel
{
public static SupplierHelper supHelper;
public static Suppliers sup;
public string Name { set; get; }
public string Address { set; get; }
public AccountViewModel()
{
loadSupplier().Wait();
}
public async Task loadSupplier()
{
supHelper = new SupplierHelper();
sup = await supHelper.getData();
}
}