Я ищу стратегию использования многопоточности (возможно, асинхронных делегатов) для выполнения синхронной операции.Я новичок в многопоточности, поэтому сначала я опишу свой сценарий.Эта синхронная операция прямо сейчас выполняется для одного набора данных (портфеля) на основе предоставленных параметров.Реализация (psudeo-code) приведена ниже:
public DataSet DoTests(int fundId, DateTime portfolioDate)
{
// Get test results for the portfolio
// Call the database adapter method, which in turn is a stored procedure,
// which in turns runs a series of "rule" stored procs and fills a local temp table and returns it back.
DataSet resultsDataSet = GetTestResults(fundId, portfolioDate);
try
{
// Do some local processing on the results
DoSomeProcessing(resultsDataSet);
// Save the results in Test, TestResults and TestAllocations tables in a transaction.
// Sets a global transaction which is provided to all the adapter methods called below
// It is defined in the Base class
StartTransaction("TestTransaction");
// Save Test and get a testId
int testId = UpdateTest(resultsDataSet); // Adapter method, uses the same transaction
// Update testId in the other tables in the dataset
UpdateTestId(resultsDataSet, testId);
// Update TestResults
UpdateTestResults(resultsDataSet); // Adapter method, uses the same transaction
// Update TestAllocations
UpdateTestAllocations(resultsDataSet); // Adapter method, uses the same transaction
// It is defined in the base class
CommitTransaction("TestTransaction");
}
catch
{
RollbackTransaction("TestTransaction");
}
return resultsDataSet;
}
Теперь требуется сделать это для нескольких наборов данных.Одним из способов было бы вызвать вышеуказанный метод DoTests()
в цикле и получить данные.Я бы предпочел делать это параллельно.Но есть определенные ловушки:
StartTransaction()
метод создает соединение (и транзакцию) каждый раз, когда он вызывается. - Все базовые таблицы базы данных, процедуры одинаковы для каждоговызов
DoTests().
(очевидно).
Таким образом, мой вопрос таков:
- Будет ли использование многопоточности в любом случае улучшать производительность?
- Каковы шансытупик, особенно когда создаются новые TestId и сохраняются тесты, TestResults и TestAllocations?Как можно обработать эти взаимоблокировки?
- Есть ли другой, более эффективный способ выполнения вышеуказанной операции, кроме многократного повторения метода
DoTests()
?