计划在线程池上异步执行的操作在调度时不会抛出异常的原因

时间:2015-02-10 05:04:50

标签: c#

我正在使用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,我想知道为什么会出现错误以及为什么它会被捕获?

错误将在此行中出现:

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

504:网关超时意味着您可以连接到主机,但由于某种原因连接已超时。原因可能是由于主机本身,其代理,DNS设置或连接问题的问题。在Difference between operation has time out and (504) Gateway Timeout

中存在类似的问题

答案 1 :(得分:0)

示例中的try / catch捕获在调用ThreadPool.QueueUserWorkItem期间发生的异常,而不是其他内容。人们可以期待像" null作为排队项目"或假设"池中没有足够的空间",但计划操作抛出的异常不会出现在该try / catch块中。

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

修复 - 尝试/捕获异步操作本身。

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

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

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