这与必须从网络上的服务器收集一些信息的程序有关。
问题:如何从GetServerResponseAsync获取异常,并通过CheckAsync向主程序检查Check气泡?
如此处所示,它们没有。 ErrorHandler永远不会受到打击。
我的主程序:
....
try
{
Task.Run(() => CheckAsync());
// bubble to here?
ReadConfiguration();
}
catch (Exception ex)
{
// gather and handle all exceptions here
ErrorHandler.NotifyMe(new[] { "some message" }, ErrorType.Stop); // never gets hit
}
public async Task CheckAsync()
{
await GetServerResponseAsync("slm_check"); // may throw exception
...
if (.....)
throw new Exception("...");
...
}
public async Task GetServerResponseAsync(string command)
{
...
// client = HttpClient()
using (apacheResponse = await client.GetAsync(ServerUrl + "...."))
{
if (....)
throw new Exception("Internal web server error", new Exception("Maybe MySQL server is down"));
using (HttpContent content = apacheResponse.Content)
{
if ( ....)
throw new Exception("error message");
}
}
}
答案 0 :(得分:3)
如何从GetServerResponseAsync获取异常,并通过CheckAsync到Check来使气泡上升到主程序?
使用await
消耗您的任务,而不是忽略它们。
具体来说,此行:
Task.Run(() => CheckAsync());
正在从Task
方法中返回Task.Run
,然后将其忽略。而不是忽略该任务,该代码应该await
对其进行编码:
await Task.Run(() => CheckAsync());
正如其他评论者所指出的,此处的Task.Run
并没有任何意义。如果您的操作是异步的,则不必也在后台线程上运行。通常。 :)因此,如果您取出Task.Run
,您的代码将如下所示:
await CheckAsync();
这将正确传播异常。