我正在使这种方法连接到物联网,并获得令牌访问权,当程序启动时,它在获得令牌之前先退出程序,我已经尝试过用这种方法在程序中吃午饭,之后什么也没有并获得令牌,但是如果我在调用此方法后放入一些代码,程序将退出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;
}
}
预计将获得令牌。
答案 0 :(得分:1)
在构造函数中,您正在调用async
方法,而无需等待它。在您的构造函数中,loginAsync
任务没有竞争,但是在调用完成之前将继续执行当前方法。
public Login() {
loginAsync();
}
不要将初始化代码放在构造函数中,而是按如下所示进行操作:
public class Foo
{
public Foo() {}
public async Task LoginAsync() { ... }
}
var obj = new Foo();
await obj.LoginAsync();
采用这种方法,它不会阻塞线程,而且更好。