首页 > 解决方案 > C# 使用 oledb 从任务返回值

问题描述

我正在访问 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整数/浮点数,所以我可以继续使用这个值。

标签: c#oledbmultitasking

解决方案


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

另外,你真的需要在 ContinueWith 中调用 Dispose() 吗?任何声明为 using 块的一部分的内容都会在自身上调用 Dispose,即使抛出异常也是如此(请参阅此博客文章以获取解释和代码示例)。

Also-2,对这篇文章的回答有一些有用的信息,说明为什么你通常不应该使用 Factory.StartNew (这是半过时的):Task.Run() 和 Task.Factory.StartNew() 之间有什么区别

希望有帮助!


推荐阅读