当我调用此方法时,没有任何反应,应用程序崩溃。我认为应该使用ExecuteAsync
方法。有人帮我吗?。这是我的代码。
CODE1 :
public Task<Connection> Connect(string userId, string password)
{
var client = new RestClient(_baseUrl)
{
Authenticator = new SimpleAuthenticator("user", userId,
"password", password)
};
var tcs = new TaskCompletionSource<Connection>();
var request = new RestRequest(AppResources.Authenticating);
client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new
JsonDeserializer().Deserialize<Connection>(response)));
return tcs.Task;
}
我也试过这段代码,但仍然存在同样的问题。
CODE2 :
public async Task<Connection> Connect(string userId, string password)
{
var client = new RestClient(_baseUrl)
{
Authenticator = new SimpleAuthenticator("user", userId,
"password", password)
};
var tcs = new TaskCompletionSource<Connection>();
var request = new RestRequest(AppResources.Authenticating);
client.ExecuteAsync<Connection>(request, response => tcs.SetResult(new
JsonDeserializer().Deserialize<Connection>(response)));
Debug.WriteLine(tcs.Task.Result.Data);
return await tcs.Task;
}
答案 0 :(得分:2)
您不希望在异步代码中使用Task.Result
或Task.Wait
。这些成员仅在您使用Task
作为任务并行库(编写并行代码)的一部分时使用。它们应该几乎不会在异步代码中使用。
在您的情况下,我怀疑您在Result
返回的Task
上调用Connect
(或者可能在调用堆栈的后面)。这可以cause a deadlock,正如我在博客上解释的那样。
我不同意@LasseVKarlsen关于初学者的异步代码。我认为现在您应该学习新的async
/ await
语言功能,这是绝对值得的。
我建议您从my introduction开始,然后使用MSDN docs和TAP pattern。然后查看我的best practices article以避免最常见的陷阱。