C# 为什么计划在线程池上异步执行的操作在计划时不会引发异常

C# 为什么计划在线程池上异步执行的操作在计划时不会引发异常,c#,C#,Im使用web服务在长数组中获得一些结果,如下所示: try { System.Threading.ThreadPool.QueueUserWorkItem((o) => { byte[] result = (new MagfaGetMessages()).getMessages(false,SMSUseProxy,SMSProxyAddress,SMSProxyUserName,SM

Im使用web服务在长数组中获得一些结果,如下所示:

      try
      {

            System.Threading.ThreadPool.QueueUserWorkItem((o) =>
            {
                byte[] result = (new MagfaGetMessages()).getMessages(false,SMSUseProxy,SMSProxyAddress,SMSProxyUserName,SMSProxyPassword,1000);
            });
            }
        }

        catch
        {
            SMSwebServiceFailed = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ff");
        }



// GetMessage Class

         public MAGFAWebService.DatedCustomerReturnIncomingFormat[] getMessages(Boolean useProxy, String proxyAddress, String proxyUsername, String proxyPassword, String username, String password, String domain, int numberOfMessages)
    {
        lock (MagfaLock)
        {
            MAGFAWebService.SoapSmsQueuableImplementationService sq = new MAGFAWebService.SoapSmsQueuableImplementationService();

            if (useProxy)
            {
                WebProxy proxy;
                proxy = new WebProxy(proxyAddress);
                proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);
                sq.Proxy = proxy;
            }
            sq.Credentials = new System.Net.NetworkCredential(username, password);
            sq.PreAuthenticate = true;

            return (MAGFAWebService.DatedCustomerReturnIncomingFormat[])sq.getMessages(domain, numberOfMessages);
        }

    }
但有时我会犯这样的错误:

The request failed with HTTP status 504: Gateway Time-out.
正如我在代码中所示,我使用了try{}catch,我想知道为什么会出现错误,为什么会出现catch

此行将出现错误:

  MAGFAWebService.DatedCustomerReturnIncomingFormat[])sq.getMessages(domain, numberOfMessages

感谢您的帮助。

504:网关超时意味着您可以连接到主机,但由于某些原因连接超时。原因可能是主机本身、其代理、DNS设置或连接问题。在调用ThreadPool.QueueUserWorkItem期间发生的示例捕获异常中有一个与此类似的问题:

Try/catch,而其他情况除外。可以预期作为队列项传递的null或假设池中没有足够的空间,但调度操作引发的异常不会显示在try/catch块中

其中一个原因是,在try/catch块完成后,操作甚至可能在一段时间内无法启动

修复-异步操作本身中的try/catch

或者-使用新的async/await,允许您编写看起来同步的异步代码:

try {
   var message = await GetMessagesAsync();
}
catch (Exception ex) {
  LogException(ex); 
}

async Task<IEnumerable<Message>> GetMessagesAsync() {....}

请注意,文章中的信息虽然正确,但与以下问题完全无关-为什么计划在线程池上异步执行的操作在启动操作之前不会在计划时引发异常?因此它会因为线程池而引发cthrow异常@阿列克谢列文科维知道发生了什么,为什么要尝试/抓住这一切。但是你能解释一下我该如何解决这个问题吗?