我正在使用C#(控制台应用程序)。
在我的程序中,我必须联系httpClient。首先,我检查客户端是否使用GetAsync
进行响应。所以我的请求方法是异步的,使我的任务异步了。
当客户端不响应(或其他响应)时,它会引发异常,但我无法捕获它。
我添加了一个ContinueWith
,但是它不起作用。有了breackpoint,我看到在我的Task的开头已经到达了这段代码,所以异常始终为null。
我该如何解决这个问题?
有我的代码:
static void Run()
{
String urlRequest = "";
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
Console.WriteLine($"Program running, press a key to stop");
try
{
Task task = Task.Factory.StartNew(async () =>
{
using (HttpClientHandler handler = new HttpClientHandler { Credentials = new NetworkCredential("user", "pass") })
{
HttpClient client = new HttpClient(handler);
client.BaseAddress = new Uri(urlRequest);
client.DefaultRequestHeaders.Accept.Clear();
bool serviceAvailable = await CheckService(client);
if (serviceAvailable)
{
bool doLoop = true;
while (doLoop)
{
// Do something
Thread.Sleep(100);
if (ct.IsCancellationRequested)
{
Console.WriteLine("\r\ntask cancelled");
break;
}
}
}
else
{
throw new HttpRequestException($"Unable to contact service at {urlRequest}");
}
}
}, ct).ContinueWith(tsk =>
{
if (tsk.Exception != null)
throw tsk.Exception;
});
Console.ReadKey();
cts.Cancel();
Thread.Sleep(1000);
}
catch (Exception e)
{
Log(e);
}
}
static async Task<bool> CheckClient(HttpClient client)
{
Console.WriteLine("Check service Call ...");
HttpResponseMessage response = await client.GetAsync("CheckService");
if (response.IsSuccessStatusCode)
{
return true;
}
return false;
}
答案 0 :(得分:2)
您既没有等待也没有观察任务的结果。假设您是针对.Net 4.5或更高版本运行此程序,则存在该异常,但它并未引起注意。
因此,首先,您应该.Wait()
完成任务,以便调用代码有机会观察到异常。
通常来说,您应该避免使用Task.Factory.StartNew()
,而更喜欢使用Task.Run()
-请参见Stephen Toub's explanation why。但是,如果出于某种原因而更愿意使用Task.Factory.StartNew
,则还必须首先.Unwrap()
原始任务才能获得想要获得结果的实际任务。 (请注意,.Unrwap()
是可用于Task<Task>
而不是Task
的扩展方法,因此请相应地键入原始变量;即,使用var task = Task.Factory.StartNew(...)
)
答案 1 :(得分:0)
ContinueWith将在任务完成时执行,无论成功与否。
如果成功,您在ContinueWith中的tsk.Exception
将为空。
您可以尝试:
.StartNew(...)
.ContinueWith(tsk =>
{
//thrown
},TaskContinuationOptions.OnlyOnFaulted);