Neetesh_Ch Ответов: 0

Является ли мой код потокобезопасным с помощью parallel.invoke


Мы создали службу dotnet Core Windows, где мы выполняем запланированные задачи по созданию CSV-файлов, возвращаемых из результатов базы данных.

Мы внедрили
Parallel.Invoke
с собой
MaxDegreeOfParallelism
установите значение 3. Я хочу проверить, является ли мой фрагмент кода потокобезопасным или нет.

Я вызвал метод
WriteListToFtp
с различными параметрами параллельно, который извлекает данные из базы данных с помощью Dapper к IEnumerable результату.

Может ли кто-нибудь помочь мне узнать, можно ли использовать параллель.Invoke создаст сценарий без потокобезопасности, так как при тестировании все результаты возвращаются правильно без каких-либо исключений без потокобезопасности.

Что я уже пробовал:

Parallel.Invoke(5,
                                () => { WriteListToFtp("SPExp_GetCountriesAll", "FLGetCountriesAll"); },
                                () => { WriteListToFtp("SPExp_GetStatesAll", "FLGetStatesAll"); },
                                () => { WriteListToFtp("SPExp_GetCitiesAll", "FLGetCitiesAll"); },
                                () => { WriteListToFtp("SPExp_GetTownsAll", "FLGetTownsAll"); },
                                () => { WriteListToFtp("SPExp_GetSendersTypeOfIdAll", "FLGetSenderStypeOfIdAll"); }                             
                           );



/// <summary>
        /// Method to fetch the results and write it to FTP.
        /// </summary>
        /// <param name="storedProcedure"></param>
        /// <param name="csvName"></param>
        /// <param name="parameters"></param>
        private void WriteListToFtp(string storedProcedure, string filename)
        {
            try
            {
                IEnumerable<dynamic> results = _primaryDBUtility.ExecuteQuery(null, storedProcedure);
                if (results != null && results.Count() > 0)
                {
                    _processCSV.IEnumerableToCSV(results, _srcFtpFilePath, _destFtpFilePath, filename);
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"The job failed. Task: CatalogExport | FileName: {filename} | Error: {ex.Message}");
            }
        }

Kornfeld Eliyahu Peter

Параллель.Invoke сам по себе не имеет ничего общего с потокобезопасностью... Вы должны проверить классы/методы, которые вы используете внутри него...

Neetesh_Ch

Да, вы правы, но способ, который я реализовал параллельно.Invoke, будет ли метод, вызываемый в параллельном потоке, прерывать параллельное выполнение ?

Kornfeld Eliyahu Peter

Итак, вы действительно спрашиваете, будут ли методы работать параллельно в реальном времени?
Я не вижу причин не делать этого - за исключением того, что я не уверен, что вы правильно определили метод... Он должен быть статичным, чтобы Invoke находил и выполнял...
Другой момент-это _ parameters (например, _primaryDBUtility), они должны быть потокобезопасными, чтобы получить к ним доступ без проблем...

Neetesh_Ch

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

public IEnumerable<dynamic> ExecuteQuery(object listParameters, string storedProcedure)
{
IEnumerable<dynamic> results = null;

using (IDbConnection conn = new SqlConnection(connectionString))
{
результаты = conn.Запросов(SQL: процедуры, параметр: listParameters, свойство commandtype: значение commandtype.Хранимая процедура);
}

возвращаемый результат;
}

Не могли бы вы помочь мне, если этот метод должен быть сделан потокобезопасным, и если да, то это лучший способ реализовать потокобезопасность. Большинство статей в интернете предлагают использовать блокировку, но мой вопрос заключается в том, что если используется блокировка, то следующие потоки будут остановлены до того, как поток, удерживающий ресурсы, завершит свое использование. Если это так, то какой смысл вызывать параллельные потоки, если каждый поток должен ждать своей очереди для выполнения.

Kornfeld Eliyahu Peter

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/asynchronous-programming?view=netframework-4.8

Neetesh_Ch

Спасибо за вашу помощь, это мне поможет.

0 Ответов