等待方法,程序在结束之前退出该方法

时间:2019-05-29 09:51:33

标签: c# asp.net-web-api

我正在使这种方法连接到物联网,并获得令牌访问权,当程序启动时,它在获得令牌之前先退出程序,我已经尝试过用这种方法在程序中吃午饭,之后什么也没有并获得令牌,但是如果我在调用此方法后放入一些代码,程序将退出log方法。

class Login
{
    public thingboardToken tbToken;
    public thingboardCredentials tbCredentials;
    public string thingsboardAPIUrl = "https://demo.thingsboard.io/api";

    public Login() {
        loginAsync();
    }

    public async System.Threading.Tasks.Task<string> loginAsync()
    {
        string requesturl = thingsboardAPIUrl + "/auth/login";

        HttpClient client = new HttpClient();

        tbCredentials = new thingboardCredentials();
        tbCredentials.username = "xxxxx";
        tbCredentials.password = "xxxxx";

        var myContent = JsonConvert.SerializeObject(tbCredentials);
        var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
        var byteContent = new ByteArrayContent(buffer);
        byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var response = await client.PostAsync(requesturl, byteContent);

        var responseString = await response.Content.ReadAsStringAsync();
        tbToken = JsonConvert.DeserializeObject<thingboardToken>(responseString);

        return responseString;
    }
}

预计将获得令牌。

1 个答案:

答案 0 :(得分:1)

在构造函数中,您正在调用async方法,而无需等待它。在您的构造函数中,loginAsync任务没有竞争,但是在调用完成之前将继续执行当前方法。

 public Login() {
        loginAsync();
 }

不要将初始化代码放在构造函数中,而是按如下所示进行操作:

public class Foo
{
   public Foo() {}
   public async Task LoginAsync() { ... }
}

var obj = new Foo();
await obj.LoginAsync();

采用这种方法,它不会阻塞线程,而且更好。