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

时间:2014-03-10 07:35:35

标签: c# multithreading

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

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

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

  1. 在一个字符串中,然后为我制作的所有4个字符串console.writeline做什么?
  2. 在每个帖子的文件中捕获数据,并在所有线程完成时执行console.writeline
  3. 其他一些类Console,其中数据的读取/写入方式与Console类相同?
  4. 我基本上希望输出与应用程序按顺序运行所有函数时的输出完全相同。

3 个答案:

答案 0 :(得分:2)

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

有很多方法可以输出到字符串。为了您的目的,也许最简单的方法是为每个线程创建一个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);
    }
}

答案 1 :(得分:1)

您应该查看任务并行库(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;

答案 2 :(得分:-1)

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

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

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

当所有线程都结束时,你马上把它们全部写下来

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

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