C # возвращаемое значение из задачи с oledb - PullRequest
0 голосов
/ 26 апреля 2019

Я обращаюсь к файлам XLSX и суммирую значения [FileSize] столбца, он содержит более 100 тыс. Строк.

Я хотел использовать OLEDB в сочетании с многозадачностью.После этого я хочу, чтобы задачи возвращали целочисленное значение / значение с плавающей запятой, чтобы я мог рассчитать процент каждого файла XLSX по сравнению с общим размером файла.Пока у меня есть этот код:

foreach (string subdir in alldir)
{
    Task<int> iSize = Task<int>.Factory.StartNew(() =>
    {
        int result = 0;
        using (OleDbConnection olecnn = new OleDbConnection(GetConnectionString(subdir)))
        {
            try
            {
                olecnn.Open();
                using (OleDbCommand sumcmd = new OleDbCommand("SELECT SUM([File Size]) FROM [FileInfos$]"))
                {
                    sumcmd.Connection = olecnn;
                    result = (int)sumcmd.ExecuteScalar();
                    //BarChart.Series["Memory Usage"].Points.AddXY(Path.GetFileName(subdir), result);
                    return result;
                }
                olecnn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString()); return result;
            }

        }
    }).ContinueWith(cnt => cnt.Dispose());
}

Кажется, есть синтаксическая ошибка

Невозможно неявно преобразовать тип 'System.Threading.Tasks.Tasks' в 'System.Threading.Tasks.Task<int>'.Существует явное преобразование (вам не хватает приведения)?

Я прочитал документы, но не могу понять, как получить result как целое число / число с плавающей запятой, поэтому я могу продолжить работу с этим значением.

1 Ответ

0 голосов
/ 26 апреля 2019

Вы запускаете задачу, которая возвращает результат int, а затем выполняете ее с другой задачей в ContinueWith, которая может возвращать только void - отсюда и возникает синтаксическая ошибка.

Кроме того, вам действительно нужно вызывать Dispose () внутри ContinueWith? Все, что объявлено как часть использования блока, будет вызывать Dispose для себя, даже если выдается исключение (см. в этом блоге для объяснения и примеров кода).

Также-2, ответы на этот пост содержат некоторую полезную информацию о том, почему вы обычно не должны использовать Factory.StartNew (который является устаревшим): В чем разница между Task.Run () и Task. Factory.StartNew ()

Надеюсь, это поможет!

...