繁体   English   中英

c#中的多线程 - 复制控制台类行为

[英]Multithreading in c# - Replicate Console class behaviour

我有一个顺序执行4个功能的应用程序。 在每个函数内部,我都有使用console.writeline记录的输出。 内部控制台将所有数据重定向到文件。

我必须改变工作方式,以便所有四个功能可以并行运行。 其他一切都很好我关心的是文件中的输出记录。 console.writeline现在将以随机顺序在文件中写入数据,这是我不想要的。 我想要完成所有线程,然后按照我想要的顺序记录所有数据的输出。

那么如何捕获每个线程内的输出?

  1. 在一个字符串中,然后为我制作的所有4个字符串执行console.writeline
  2. 捕获每个线程的文件中的数据,并在所有线程完成时执行console.writeline
  3. 其他一些类如Console ,其数据的读取和写入方式与Console类相同?

我基本上希望输出与应用程序按顺序运行所有函数时的输出完全相同。

如果您知道所有输出都适合内存,那么您可以将输出写入字符串,然后在完成后将这些字符串附加到文件中。

输出到字符串有很多种方法。 为了您的目的,也许最简单的方法是为每个线程创建一个StringWriter 例如:

StringWriter output = new StringWriter();

然后,将所有Console.WriteLine调用替换为output.WriteLine

线程完成后,可以通过调用ToString将输出转换为字符串。 那是:

string threadOutput = output.ToString();

然后获取每个线程的输出并按所需顺序写入文件。

如果输出太大而无法放入内存,那么让每个线程打开一个StreamWriter ,它将写入文件。 完成四个线程后,您可以依次打开每个文件,读取数据并写入输出。 就像是:

using (FileStream outputFile = File.OpenWrite(outputFileName))
{
    // do the following for each thread's output
    using (FileStream threadFile = File.OpenRead(inputFilename))
    {
        threadFile.CopyTo(outputFile);
    }
}

您应该看一下Task Parallel Library(TPL)。

然后你可以开始几个任务,等到所有完成,然后按你喜欢的顺序打印他们的结果(例如字符串)....

这是来自msdn docs( MSDN TPL ):

等到所有任务完成:

// Wait for all tasks to complete.
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
   tasks[i] = Task.Factory.StartNew(() => DoSomeWork(10000000));
}
Task.WaitAll(tasks);

具有返回值的任务:

// Return a value type with a lambda expression
Task<string> task1 = Task<string>.Factory.StartNew(() => "some text");
int i = task1.Result;

据我了解,这四种方法总是一起调用,所以你可以做的就是每次调用它们时,首先将四行空行添加到日志文件中,然后每个方法可以在相对于预定的行上写出它自己的输出到日志文件中的行数。 如果您绝对不想等待所有方法完成,那就是这样。

但是因为访问文件比在字符串中写入值更长,我建议您使用字符串数组或类似的东西:

string[] output = new string[4];
private void method1()
{
    output[1] = some_stuff.ToString();
}
...

当所有线程都结束时,你立刻写下它们

foreach (string s in output) Console.WriteLine(s);

这几乎是最简单,最快捷的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM