C# 线程异步处理



我有一个应用程序,我选择线程。 这背后的意图是一次运行多个线程以加快应用程序的速度。

目前,我循环应用程序设置,为每个设置创建一个线程,然后启动每个设置并加入,以便我可以知道它们何时完成。

不幸的是,在这样做时,每个线程都是同步运行的,这违背了目的。

我可以更改它以删除连接,但是我无法确定所有线程何时完成(我需要这样做,因为当它们全部完成时,我有一个进程要运行)。

我开始认为线程不适合我,但我应该更多地关注threading.tasks或parallel.foreach,但我不确定其中任何一个的复杂性。 我以前没有使用过这两种机制(也只涉足线程)

下面是当前生成我的线程的代码片段

foreach (SettingsProperty value in Properties.Settings.Default.Properties)
{
//parse out the line in the settings
if (value.Name.ToString() != <<criteria>>)
{
//this is one that we want to do something with
sett = value.DefaultValue.ToString().Split(stringSeparators, StringSplitOptions.None);
//set the directory
Directory.CreateDirectory(<<directory>>);
//fire the thread to retrieve the image form the url
ThreadWithState tws = new ThreadWithState(<<parameters>>);
Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
t.Join();
}
}
UploadFiles();

目前,这会逐个执行线程,然后执行最后一个进程。 如果我删除 t.join 调用,这将异步运行线程,但也会在所有线程完成之前执行上传。

我如何更改此代码以等待所有线程完成,或者 实现Parallel.ForEach(我认为可能有效,但不理解)或 实现一些threading.tasks函数,以便我可以使用Task.WhenAll方法(我认为该方法也可以工作,但不理解)

Thread.Join()指示执行线程阻塞(等待),直到另一个线程完成其任务。

所以这个

t.Start();
t.Join();

字面意思是开始任务,在完成之前什么都不做。

如果你想使用Parallel.ForEach你可以从创建你想要操作的任何内容的列表开始。例如

var properties = Properties.Settings.Default.Properties
.Where(property => Name != "whatever");

现在properties是一个IEnumerable<SettingsProperty>- 一个可以枚举或循环访问的集合。

现在您可以执行此操作:

Parallel.ForEach(properties, (property) =>
{
// do something with the property.
});

这本质上与

foreach(var property in properties)
{
// do something with the property.
}

除了循环的迭代可以在并发线程上运行。"May",因为任务计划程序根据工作负载和可用内容使用线程。

最新更新