异常由最外层的try / catch处理。 Windows服务

时间:2014-07-10 14:31:17

标签: c# .net multithreading exception windows-services

抛出ThirdPartyException(我不知道他们的代码是如何工作的)异常的函数:

private void RequestDocuments(/* arguments... */) {
    while(true) {
        var revision = lastRevision;
        var fetchedDocuments = 0;

        try {
            foreach(var document in connection.QueryDocuments(revision)) {
                if(fetchedDocuments > fetchQuota) return;

                container.Add(document);
                ++fetchedDocuments;

                Logger.Log.InfoFormat("added document (revision: {0}) into inner container", document.Revision);
            }

            Logger.Log.Info("Done importing documents into the inner container");
            return;
        }
        catch(Exception ex) {
            if(ex is ThirdPartyException) {
                // handle this in a certain way!
                continue;
            }
        }
    }
}

在这样的工作线程中调用此函数:

private void ImportDocuments() {
    while(!this.finishedEvent.WaitOne(0, false)) {
        try {
            var documents = new List<GohubDocument>();
            RequestDocuments(remoteServerConnection, documents, lastRevision, 100);
        }
        catch(Exception ex) {
            // here is where it really gets handled!!!?
        }
    }
}

异常仅在最外层(在ImportDocuments方法内)try/catch内处理。

为什么?

1 个答案:

答案 0 :(得分:1)

如果这是一个公开IQueryable的LINQ API,那么由于LINQ to SQL实现通常使用的延迟执行,您不会收到错误。

要防止它,您必须在第一种方法中调用.ToList()FirstOrDefault()等。这确保了查询确实已针对您的数据源执行。

解决方案:

var documents = connection.QueryDocuments(revision).ToList();
foreach(var document in documents) {
    if(fetchedDocuments > fetchQuota) return;
    // [...]
}