Проблемная ситуация
В моем проекте я звоню в PowerShell, чтобы получить список организаций, настроенных в Exchange 2010. Затем я должен сделать что-то для каждой организации.Вызов PowerShell sloooow , поэтому, если бы я выполнял все последовательные операции, это заняло бы минуты.Тем не менее, вы можете создать PowerShell Runspace Pool и выполнять команды параллельно, что экономит много времени.Вот что я сделал:
public void MainMethod()
{
var organizations = exchangeRepository.GetOrganizations();
Parallel.ForEach(
organizations,
organization =>
{
try
{
exchangeRepository.DoSomethingWithAnOrganization(organization);
}
catch (Exception ex)
{
...
}
}
);
}
Задача
Это работает как заклинание с одним исключением.Метод DoSomethingWithAnOrganization имеет функцию try-catch и может обрабатывать некоторые исключения.Однако всякий раз, когда возникает исключение, оно не обрабатывается catch в методе DoSomething, а сразу переходит к оператору catch объекта MainMethod.
(Примечание: оператор catch метода DoSomethingназывается нормально, если я просто использую foreach (... in ...) вместо Parallel.ForEach).
Вопрос
Почему я не могу справитьсяисключение в DoSomething-методе?Есть ли способ сделать DoSomething параллельным по-другому, поэтому при возникновении исключения вызывается перехват этого метода?
Спасибо!
Это метод DoSomething:
public IEnumerable<Mailbox> Invoke(string organizationName)
{
try
{
var command = new PSCommand()
.AddCommand("Get-Mailbox")
.AddParameter("Organization", organizationName);
var result = Invoke(command);
var mailboxes =
from mailbox in result.Results
select new Mailbox()
{
Organization = organizationName,
Name = (string)mailbox.Properties["Name"].Value,
Identity = mailbox.Properties["Identity"].Value.ToString(),
Plan =
mailbox.Properties["MailboxPlan"].Value == null
? null
: (string)mailbox.Properties["MailboxPlan"].Value
.GetType().GetProperty("Name")
.GetValue(mailbox.Properties["MailboxPlan"].Value, null),
};
return mailboxes;
}
catch (Exception ex)
{
Log.Error(ex.Message, ex);
throw new Exceptions.ReportingServiceException(Exceptions.ExceptionType.Technical, ex.Message, ex);
}
}