oledb的Task的C#返回值

时间:2019-04-26 00:15:04

标签: c# oledb multitasking

我正在访问XLSX文件并汇总一列的[FileSize]值,它包含超过100k行。

我想将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 :(得分:0)

您启动一个任务,该任务返回一个int结果,然后在ContinueWith中执行另一个只能返回void的任务-这就是语法错误的来源。

此外,您是否真的需要在ContinueWith中调用Dispose()?声明为using块一部分的任何东西,即使抛出异常也将在其自身上调用Dispose(有关解释和代码示例,请参见this blog post

也2,此帖子的答案提供了一些有关为何通常不应该使用Factory.StartNew(半废弃)的有用信息:What is the difference between Task.Run() and Task.Factory.StartNew()

希望有帮助!