异步/等待:冒泡异常?

时间:2019-10-02 13:46:28

标签: c# asynchronous exception

这与必须从网络上的服务器收集一些信息的程序有关。

问题:如何从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");
        }
    }
}            

1 个答案:

答案 0 :(得分:3)

  

如何从GetServerResponseAsync获取异常,并通过CheckAsync到Check来使气泡上升到主程序?

使用await消耗您的任务,而不是忽略它们。

具体来说,此行:

Task.Run(() => CheckAsync());

正在从Task方法中返回Task.Run,然后将其忽略。而不是忽略该任务,该代码应该await对其进行编码:

await Task.Run(() => CheckAsync());

正如其他评论者所指出的,此处的Task.Run并没有任何意义。如果您的操作是异步的,则不必在后台线程上运行。通常。 :)因此,如果您取出Task.Run,您的代码将如下所示:

await CheckAsync();

这将正确传播异常。