我有以下四個測試,當我運行它的最後一掛,我的問題是,爲什麼出現這種情況:等待的作品,但呼籲task.Result掛起/死鎖
[Test]
public void CheckOnceResultTest()
{
Assert.IsTrue(CheckStatus().Result);
}
[Test]
public async void CheckOnceAwaitTest()
{
Assert.IsTrue(await CheckStatus());
}
[Test]
public async void CheckStatusTwiceAwaitTest()
{
Assert.IsTrue(await CheckStatus());
Assert.IsTrue(await CheckStatus());
}
[Test]
public async void CheckStatusTwiceResultTest()
{
Assert.IsTrue(CheckStatus().Result); // This hangs
Assert.IsTrue(await CheckStatus());
}
private async Task<bool> CheckStatus()
{
var restClient = new RestClient(@"https://api.test.nordnet.se/next/1");
Task<IRestResponse<DummyServiceStatus>> restResponse = restClient.ExecuteTaskAsync<DummyServiceStatus>(new RestRequest(Method.GET));
IRestResponse<DummyServiceStatus> response = await restResponse;
return response.Data.SystemRunning;
}
我使用這個擴展爲restsharp RestClient方法:
public static class RestClientExt
{
public static Task<IRestResponse<T>> ExecuteTaskAsync<T>(this RestClient client, IRestRequest request) where T : new()
{
var tcs = new TaskCompletionSource<IRestResponse<T>>();
RestRequestAsyncHandle asyncHandle = client.ExecuteAsync<T>(request, tcs.SetResult);
return tcs.Task;
}
}
public class DummyServiceStatus
{
public string Message { get; set; }
public bool ValidVersion { get; set; }
public bool SystemRunning { get; set; }
public bool SkipPhrase { get; set; }
public long Timestamp { get; set; }
}
爲什麼最後TES掛?
你應該避免異步方法返回void。它只是爲了向後兼容現有的事件處理程序,主要是在接口代碼中。如果你的異步方法沒有返回任何東西,它應該返回任務。我有MSTest和無效返回異步測試無數問題。 – ghord
@ghord:MSTest根本不支持'async void'單元測試方法;他們根本無法工作。但是,NUnit的確如此。這就是說,我同意'async Task'優先於'async void'的一般原則。 –
@StephenCleary是的,雖然它在VS2012的beta版中被允許,但它導致了各種問題。 – ghord