【发布时间】:2018-07-18 13:42:52
【问题描述】:
场景是这样的,我手头有 4 个特定的 URL,每个 URL 页面包含许多指向网页的链接,我需要提取这些网页的一些信息。我打算使用嵌套任务来完成这项工作,一个任务中的多个任务。如下所示。
var t1Actions = new List<Action>();
var t1 = Task.Factory.StartNew(() =>
{
foreach (var action in t1Actions)
{
Task.Factory.StartNew(action, TaskCreationOptions.AttachedToParent);
}
});
var t2Actions = new List<Action>();
var t2 = Task.Factory.StartNew(() =>
{
foreach (var action in t2Actions)
{
Task.Factory.StartNew(action, TaskCreationOptions.AttachedToParent);
}
});
var t3Actions = new List<Action>();
var t3 = Task.Factory.StartNew(() =>
{
foreach (var action in t3Actions)
{
Task.Factory.StartNew(action, TaskCreationOptions.AttachedToParent);
}
});
var t4Actions = new List<Action>();
var t4 = Task.Factory.StartNew(() =>
{
foreach (var action in t4Actions)
{
Task.Factory.StartNew(action, TaskCreationOptions.AttachedToParent);
}
});
Task.WhenAll(t1, t2, t3, t4);
这是我的问题:
- 这种方式是完成我上面提到的工作的好方法吗?
- 哪个效率高,将子任务替换为
Parallel.Invoke(action)还是保持原样? - 如果嵌套任务完成,我应该如何通知(例如 UI),我是否可以控制嵌套任务?
任何建议都会有所帮助。
【问题讨论】:
-
不,这不是一个好方法。您应该使用
await和asyncAPI 方法从网页读取信息,例如byte[] urlContents = await client.GetByteArrayAsync(url);。 (见HttpClient.GetByteArrayAsync()) -
“这种方式是完成我上面提到的工作的好方法吗?”运行代码时发生了什么?成功了吗?
-
@Servy 我想听听专家的意见,我还没有开始。
-
@saber 然后开始。做你的研究。尝试自己解决问题。看看他们工作得如何。一旦遇到无法通过研究或自己尝试解决的问题,请在 SO 上提问。
标签: c# .net multithreading task task-parallel-library