在Wait()方法下面的代码中,永远不会引发任务取消引起的异常,也永远不会将控制权返回给调用线程。
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://stackoverflow.com")
{
Content = new ObjectContent<Foo>(new Foo(), new JsonMediaTypeFormatter())
};
CancellationTokenSource cts = new CancellationTokenSource();
HttpClient client = new HttpClient();
Task task = client.SendAsync(request, cts.Token);
cts.Cancel();
task.Wait();
但是,当request.Content是具有序列化Foo对象的StringContent时,将引发异常。我的期望是所有HttpContent类型都将引发异常。
为什么不引发异常?
创建StringContent的解决方法不好。也许是否存在其他解决方法?
您编写了经典的异步死锁任务。等待等待操作,该操作将永远不会完成,因为您的线程在“等待”中被阻塞。您需要等待任务,然后它将按预期工作。取消异常将在等待行上引发。
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://stackoverflow.com")
{
Content = new ObjectContent<Foo>(new Foo(), new JsonMediaTypeFormatter())
};
CancellationTokenSource cts = new CancellationTokenSource();
HttpClient client = new HttpClient();
Task task = client.SendAsync(request, cts.Token);
cts.Cancel();
await task;