c# - 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
整数/浮点数,所以我可以继续使用这个值。
解决方案
您启动一个返回int
结果的任务,然后执行另一个ContinueWith
只能返回的任务void
——这就是语法错误的来源。
另外,你真的需要在 ContinueWith 中调用 Dispose() 吗?任何声明为 using 块的一部分的内容都会在自身上调用 Dispose,即使抛出异常也是如此(请参阅此博客文章以获取解释和代码示例)。
Also-2,对这篇文章的回答有一些有用的信息,说明为什么你通常不应该使用 Factory.StartNew (这是半过时的):Task.Run() 和 Task.Factory.StartNew() 之间有什么区别
希望有帮助!
推荐阅读
- xml - 如何在 hive 中附加 xml 数据并添加 xml 版本和编码
- html - 积极的
- javascript - 如何使用axios或fetch支持IE7
- python - 如何从 docker 容器中的 python 脚本连接到 localhost 上的 mysql 数据库
- python - Python中时间序列的牛顿算法函数
- python-3.x - Python:一个线程如何在恢复执行之前等待其他线程结束?
- ios - 翠鸟:'setBackgroundImage(with:for:placeholder:options:progressBlock:completionHandler:)' 的模糊使用
- javascript - 调用时如何将未知的附加参数传递给回调函数?
- html - 显示:内联块在手机上不起作用
- c# - 操作员 '!' 不能应用于 x 类型的操作数