【发布时间】:2015-07-02 01:31:27
【问题描述】:
我已经阅读了很多关于如何为任务返回值的内容,但我似乎无法让它在我的代码上运行,并且仍然产生System.Threading.ThreadAbortException。
尝试使用Task.WaitAll,尽管这可能会阻塞 UI,但无济于事。
public DataTable GetResult(SomeVariable someVariable) {
// this do not work
//var task = Task<DataTable>.Factory.StartNew(() =>
var task = Task.Factory.StartNew<DataTable>(() =>
{
DataTable matchedData = new DataTable();
matchedData = DoTask(someVariable);
return matchedData;
}, TaskCreationOptions.LongRunning);
try
{
var allTasks = new Task[] { task };
Task.WaitAll(allTasks);
return task.Result as DataTable;
}
catch (ArgumentException)
{
throw;
}
catch (Exception)
{
// Always get the exception here: "A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll"
throw;
}
}
尝试使用ContinueWhenAll,但还是一样。
public DataTable GetResultV2(SomeVariable someVariable)
{
queue = new Queue<Task>();
DataTable matchedData = new DataTable();
var task = Task.Factory.StartNew(() =>
{
matchedData = DoTask(someVariable);
return matchedData;
}, TaskCreationOptions.LongRunning);
queue.Enqueue(task);
try
{
var done = Task.Factory.ContinueWhenAll(queue.ToArray(), completed =>
{
return matchedData;
});
return done.Result as DataTable;
}
catch (ArgumentException)
{
throw;
}
catch (Exception)
{
// Always get the exception here: "A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll"
throw;
}
}
DoTask 只是一种检查和查询数据库的方法。
private DataTable DoTask(SomeVariable someVariable)
{
DataTable matchedData = new DataTable();
// long database process/query
// populate and return matchedData
return matchedData;
}
编辑:供参考如何/为什么使用它。
foreach (DataRow row in data.Rows)
{
string columnName = Convert.ToString(row["columnName"]);
string ProjectName = Convert.ToString(row["ProjectName"]);
string dbase_group = Convert.ToString(row["dbase_group"]);
string dbase_data = Convert.ToString(row["dbase_data"]);
var task = Task.Factory.StartNew(() =>
{
SomeVariable someVariable = new SomeVariable();
someVariable.DbName = dbase_group;
someVariable.columnName = columnName;
someVariable.ProjectName = ProjectName;
someVariable.TblName = dbase_data;
using (SearchProject search = new SearchProject())
{
DataTable result = new DataTable();
result = search.GetResult(SomeVariable);
}
});
queue.Enqueue(task);
}
Task.Factory.ContinueWhenAll(queue.ToArray(), ant =>
{
Console.WriteLine("Done with all tasks");
});
【问题讨论】:
-
为什么要在这种情况下使用任务?
-
请参阅上面的更新代码。
-
请将该代码添加到您的原始帖子中,使其格式正确,并且每个人都可以将其视为问题的一部分。
-
请查看更新后的代码。
-
我很确定您正在从外部中止线程。虽然这段代码是使用
Tasks 的糟糕方法,但没有机会从内部使用Thread.Abort。尝试在整个代码库中搜索Thread.Abort。此外,您确实意识到您永远不会返回result,对吧?
标签: c# .net multithreading task