Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 沙马林_C#_Android_Xamarin - Fatal编程技术网

C# 沙马林

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

我正在尝试开发我的第一个Xamarin应用程序

我有两个Web服务类: RestClient:它发出请求并获取json字符串 Helper类:它应该获取Json字符串并将其反序列化为对象类型

我知道
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();
    }   
}