【问题标题】:Asynchronous programming in .Net Console application.Net 控制台应用程序中的异步编程
【发布时间】:2016-06-20 09:41:14
【问题描述】:

我有一个解压缩文件夹和合并文件的应用程序,我想在这里使用异步,我想要一个线程解压缩文件夹,另一个线程合并解压缩文件夹中的文件,一旦解压缩线程完成其任务,应用程序应该等待合并线程完成。合并线程(子)依赖于解压线程(父) 下面是我正在使用的代码 在 program.cs 文件中

var t1= Task.Factory.StartNew(() =>
    {                       
       obj.UnZipFiles(files, formats);
    });

在 unzip.cs 文件中

var t2= Task.Factory.StartNew(() =>
    {
        obj.MergeFiles();
    });

在program.cs文件中,我有

Task.WaitAll(t1); 

我的应用程序没有等待子线程完成, 任何帮助将不胜感激。

【问题讨论】:

  • 如果步骤 2 只能在步骤 1 之后发生,则没有并发和异步。你确定你理解问题吗?听起来您是从一个不存在的问题的解决方案开始。
  • 你在说什么“子线程”?顺便提一句。我们在这里处理的是 Tasks,而不是线程。
  • @usr 考虑一个例子:2 个 zip 文件夹,每个文件夹有 10 个文件,我希望应用程序完成第一个 zip 文件夹的解压缩并开始合并其中的 10 个文件,同时它应该开始解压缩第二个 zip文件夹,而应用程序正在合并第一个 zip 文件夹中的文件
  • 我明白了,这更有意义。

标签: c# .net multithreading async-await console-application


【解决方案1】:

创建第二个任务时,使用Continuation。

例如

var t1 = new Task(() => obj.UnZipFiles(files, formats));
var t2 = t1.ContinueWith((t) => obj.MergeFiles());
t1.Start();

这将确保第二个任务仅在第一个任务完成时触发。

【讨论】:

  • 感谢您的建议,我想这会使任务同步,如果我错了,请纠正我
  • @Kiran_Ray 据我了解,这将是一种“某种”同步处理,因为当第一个任务结束时,第二个任务将在不同的线程上运行。如果你传入TaskContinuationOptions.ExecuteSynchronously,那么第二个任务将与第一个任务在同一个线程上运行,使其真正同步。
  • @Kiran_Ray 另一方面,如果您需要等待第一个任务的结果,因为在第一个任务完成之前您无法做任何其他事情......那么使用任务可能没有多大意义?
  • 下面的示例将为您提供清晰的图片 2 个 zip 文件夹,每个文件夹有 10 个文件,我希望应用程序完成第一个 zip 文件夹的解压缩并开始合并其中的 10 个文件,同时它应该开始解压缩第二个文件zip 文件夹,而应用程序正在合并第一个 zip 文件夹中的文件
猜你喜欢
  • 2019-09-14
  • 2016-11-02
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多