Task.Run 是否保证每个方法都会 运行 完成
Does Task.Run guarantee each method will be run to completion
有两种方法一起必须并行运行,这是由于时间限制。例如,下一条要处理的数据每 100 毫秒出现一次。
List<Widget> widgetList = new List<Widget>()
{
file list with 100 widget objects
}
List<Task> tasks = new List<Task>();
foreach (Widget widget in widgetList)
{
Task t = Task.Run(async () =>
{
var result = await widget.Analyze(newData);
ReportResults(result);
});
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
不,这不是一个完整的代码示例,但应该足以解决如下问题:
我可以确定 ReportResults(result) 将 运行 完成每个任务,或者是否有可能如果一个任务完成并调用 ReportResults(result) 然后另一个任务完成它可以调用 ReportResults(result) 导致不可预测的行为?
TIA,
道格
每个方法都将 运行 完成,除非有东西拆除进程或应用程序域。
作为 "call ReportResults(result) resulting in unpredictable behavior",这取决于 ReportResults
的工作方式。
我会这样做:
var results = await Task.WhenAll(
for widget in widgetList
select widget.Analyze(newData));
foreach (var result in results)
{
ReportResults(result);
}
注意: async-await
是 C# 5.0 的功能,在 C# 4.0 中不可用。
有两种方法一起必须并行运行,这是由于时间限制。例如,下一条要处理的数据每 100 毫秒出现一次。
List<Widget> widgetList = new List<Widget>()
{
file list with 100 widget objects
}
List<Task> tasks = new List<Task>();
foreach (Widget widget in widgetList)
{
Task t = Task.Run(async () =>
{
var result = await widget.Analyze(newData);
ReportResults(result);
});
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
不,这不是一个完整的代码示例,但应该足以解决如下问题: 我可以确定 ReportResults(result) 将 运行 完成每个任务,或者是否有可能如果一个任务完成并调用 ReportResults(result) 然后另一个任务完成它可以调用 ReportResults(result) 导致不可预测的行为?
TIA, 道格
每个方法都将 运行 完成,除非有东西拆除进程或应用程序域。
作为 "call ReportResults(result) resulting in unpredictable behavior",这取决于 ReportResults
的工作方式。
我会这样做:
var results = await Task.WhenAll(
for widget in widgetList
select widget.Analyze(newData));
foreach (var result in results)
{
ReportResults(result);
}
注意: async-await
是 C# 5.0 的功能,在 C# 4.0 中不可用。