我有以下功能:
async public Task<bool> checkNetwork (RestClient _client, ConnectivityManager conn)
{
var connected = false;
var activeConn = conn.ActiveNetworkInfo;
if (activeConn != null && activeConn.IsConnected) {
var request = new RestRequest ();
request.Timeout = 5000;
var response = await _client.ExecuteAwait (request);
//Task<IRestResponse> tmpResponse = _client.ExecuteAsync (request);
if (response.ErrorException != null)
connected = false;
else
connected = true;
}
return connected;
}
它一直挂起,因为当我调用它时状态永远不会离开WaitingForActivation。有什么想法吗?
答案 0 :(得分:13)
它一直悬挂,因为当我调用它时状态永远不会离开WaitingForActivation。
实际上,WaitingForActivation
只表示任务尚未完成。这不是挂起的原因,而是它的一个指标。承诺任务(包括async
方法返回的任务)将保持WaitingForActivation
状态,直到完成为止;我更详细地描述了任务状态机on my blog。
导致死锁的最可能原因是在堆栈中进一步调用Task<T>.Result
或Task.Wait
。我在完整的on my blog中描述了这个死锁,但它的要点是await
将捕获“当前上下文”并使用它来恢复其async
方法。如果从UI线程调用,那么该上下文是UI线程,如果通过调用Result
/ Wait
阻止了UI线程,那么async
方法无法在该UI线程上恢复