gpt4 book ai didi

c# - 如何在 Linux 上的单声道 (c#) 上运行的应用程序中重定向输出,以避免在多个线程写入控制台时出现 'Array index is out of range.'?

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:26 26 4
gpt4 key购买 nike

在我们的应用程序中,我们按以下方式重定向输出:


FileStream fsOut = new FileStream(filename, FileMode.Append, FileAccess.Write);
swOut = new StreamWriter(fsOut);
Console.SetOut(swOut);
Console.SetError(swOut);

测试:


private StreamWriter _swOut = null;
    [TestCase(100, "output.txt")]
public void RawThreadsTests(int howMany, string filename) {
FileStream fsOut = new FileStream(filename, FileMode.Append, FileAccess.Write);
_swOut = new StreamWriter(fsOut);
Console.SetOut(_swOut);
Console.SetError(_swOut);

Thread[] threads = new Thread[howMany];
Container c = TestContainer;

for(int i = 0; i < howMany; i++) {
threads[i] = new Thread(unused => Write());
threads[i].Start();
}
//Wait for all threads
for(int i = 0; i < howMany; i++) {
threads[i].Join();
}
}

static void Write() {
Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
}

顺便说一句。 logged string的长度是一些NHibernate log sql语句的长度。

在 mono 2.10.1 上运行此测试将导致多个:


(..).RawThreadsTests(100,"output.txt") : System.IndexOutOfRangeException: Array index is out of range.
at System.IO.StreamWriter.LowLevelWrite (System.String s) [0x00000] in :0
at System.IO.StreamWriter.Write (System.String value) [0x00000] in :0
at System.IO.TextWriter.WriteLine (System.String value) [0x00000] in :0
at System.Console.WriteLine (System.String value) [0x00000] in :0

(..).RawThreadsTests(100,"output.txt") : System.ArgumentException: Reading would overrun buffer
at System.IO.FileStream.Write (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in :0
at System.IO.StreamWriter.FlushBytes () [0x00000] in :0
at System.IO.StreamWriter.Decode () [0x00000] in :0
at System.IO.StreamWriter.LowLevelWrite (System.String s) [0x00000] in :0
at System.IO.StreamWriter.Write (System.String value) [0x00000] in :0
at System.IO.TextWriter.WriteLine (System.String value) [0x00000] in :0
at System.Console.WriteLine (System.String value) [0x00000] in :0

如果输出没有被重定向,这些测试将不会失败。

注意:与许多包含多线程的测试一样,并非每次运行都会产生错误。

是否有其他方法或将 Console.WriteLine 重定向到应用程序内部的文件?

提前致谢,
泰美克

最佳答案

StreamWriter 不是线程安全的。你应该使用 TextWriter.Synchronized 如果您想让输出提交到不同的线程。

关于c# - 如何在 Linux 上的单声道 (c#) 上运行的应用程序中重定向输出,以避免在多个线程写入控制台时出现 'Array index is out of range.'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9529301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com