Долго работающий код в фоновом потоке? - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть следующий метод в одном из моих бизнес-менеджеров:

    public ImportItemsResult Import(String fullPath)
    {
        OleDbDataManager oleDbDataManager = new OleDbDataManager();
        List<ItemInfo> importedData = oleDbDataManager.GetData<ItemInfo>(fullPath, ItemInfoMapper).ToList();
        ImportItemsResult result = ValidateImportedData(importedData);
        if (result.Status == OperationStatus.Success)
        {
            //do something with importedData in the background and return 
            //the result to the user right away
        }
        return result;
    }

Код позволяет пользователю загрузить файл .csv, который затем анализируется и проверяется.После проверки, если все данные были в порядке, данные обрабатываются и сохраняются в базе данных, в противном случае файл отклоняется, и пользователю отображается пользовательский интерфейс с подробным сообщением об ошибке.

  • Можно ли предположить, что, как только проверка приводит к успешному завершению, обработка должна - теоретически - пройти нормально, потому что все данные действительны?* Можно ли запустить код обработки в фоновом потоке и сразу же вернуться из этого метода?Могу ли я сделать это внутри оператора if в приведенном выше коде или мне нужно перестроить все это?показать эту функциональность через веб-сервис WCF, и я не знаю, как долго он будет обрабатывать данные, что может привести к превышению времени ожидания веб-сервиса в случае, если это займет слишком много времени.Есть предложения?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2012

Вы никогда не должны доверять параметрам или ожидать, что «все будет работать нормально», вы должны использовать операторы try / catch и реализовать что-то для обработки ошибок (что-то регистрировать, отправлять подробную информацию службе клиентов, ...).

Чтобы избежать тайм-аута, вы должны настроить службу WCF для поддержки асинхронной операции.

Кстати, ваш OleDbDataManager является IDisposable?Если это так, вы должны включить ключевое слово using для предотвращения утечек памяти.

0 голосов
/ 12 марта 2013

Здесь нужно учесть несколько вещей:

  • Единственная «безопасная» вещь, которую можно предположить, это то, что все, что может пойти не так будет идти не так.Вероятно, вам следует использовать транзакции при записи в базу данных.
  • Хотя можно определенно опубликовать операцию в пуле потоков (даже в IIS), я не вижу, к чему это приведет.Вам все еще нужно отправить ответ клиенту.Еще несколько вопросов, которые вам нужно задать:
    • Как долго это «длинный»?Возможно ли, чтобы клиент подождал?Вы можете увеличить тайм-аут отправки сервиса до разумного числа.
    • Если вам действительно нужна асинхронная операция, вы можете использовать другие механизмы, такие как дуплексные каналы или какой-либо тип публикации / подписки.Затем вызов может немедленно вернуться, и клиент может ожидать ответа, используя эти механизмы.Но это сделает проект намного более сложным.
  • У вас также есть возможность передавать данные и обрабатывать их по мере необходимости, вместо одного большого куска.Подробнее здесь .Это может сэкономить некоторое время, потому что вы будете обрабатывать куски как можно скорее (это не сработает, если вам потребуется проверить набор данных в целом.)
0 голосов
/ 12 февраля 2012

После проверки все еще есть вещи, которые могут пойти не так - ваша служба WCF может выйти из строя или машина, на которой она работает, теряет питание - вы теряете все данные.

Вам необходимо сохранить данные CSV на энергонезависимой среде до того, как вернет результат.Также я бы поместил долго работающий код в отдельную службу Windows (при условии, что ваша служба WCF размещена на IIS, в противном случае вы можете объединить эти две функции), которая просто выполняет обработку.Вы можете использовать базу данных, которую веб-служба WCF и служба Windows используют для хранения и получения данных CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...