Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开交叉线程写入_C#_Stream_Binaryformatter - Fatal编程技术网

C# 打开交叉线程写入

C# 打开交叉线程写入,c#,stream,binaryformatter,C#,Stream,Binaryformatter,打开文件并跨多个线程向其写入流是否安全?如果没有,我可以实现什么使其安全?没有,标准文件流不是线程安全的 您应该使用var safe=Stream.Synchronized(File.Open(…)创建线程安全包装器 否,标准FileStream不是线程安全的 您应该使用var safe=Stream.Synchronized(File.Open(…)创建线程安全包装器 否。这不是线程安全的。直观地说,当索引是移动目标时,如何写入文件?一种想法是创建单独的文件,并将它们与另一个进程相结合,可能由

打开文件并跨多个线程向其写入流是否安全?如果没有,我可以实现什么使其安全?

没有,标准文件流不是线程安全的

您应该使用
var safe=Stream.Synchronized(File.Open(…)
创建线程安全包装器


否,标准FileStream不是线程安全的

您应该使用
var safe=Stream.Synchronized(File.Open(…)
创建线程安全包装器


否。这不是线程安全的。直观地说,当索引是移动目标时,如何写入文件?一种想法是创建单独的文件,并将它们与另一个进程相结合,可能由某种类型的已完成事件触发(例如,所有文件都已到达)


使用多线程写入单个文件的概念有一些代码味道。在我看来,请重新检查您的选项,并提出解决此问题的不同方法。

否。这不是线程安全的。直观地说,当索引是移动目标时,如何写入文件?一种想法是创建单独的文件,并将它们与另一个进程相结合,可能由某种类型的已完成事件触发(例如,所有文件都已到达)


使用多线程写入单个文件的概念有一些代码味道。依我看,重新审视你的选择,想出一种不同的方法来解决这个问题。

否;它本身并不安全,但您可以使用
lock
关键字来控制对FileStream对象的跨线程访问

例如:

FileStream fStream = File.Open('foo.txt', FileMode.Append);

lock (fStream)
{
  // Some operation on fStream
}

Knaģis给出的答案可能是这种情况下的解决方法,但使用
lock
关键字的互斥锁是一种更通用的解决方案;它本身并不安全,但您可以使用
lock
关键字来控制对FileStream对象的跨线程访问

例如:

FileStream fStream = File.Open('foo.txt', FileMode.Append);

lock (fStream)
{
  // Some operation on fStream
}

Knaģis给出的答案可能是这种情况下的解决方法,但使用
lock
关键字的互斥锁是一种更通用的解决方案。

您是共享同一个流对象,还是试图在每个线程中打开不同的流?为了保持理智,请不要这样做。将所有写入封送到由单个线程处理的队列结构。您是共享同一个流对象,还是尝试在每个线程中打开不同的流?为了保持理智,请不要这样做。将所有写操作封送到一个由单个线程处理的队列结构中。是否有此实现的示例,我一直在搜索Google,但没有取得任何成果。您只需使用
Stream.Synchronized
创建包装器,然后像使用任何其他流一样使用它。将其传递给其他方法,在其上创建StreamReader/Writer等。谢谢!最后一个问题,它是否保持了我写作的顺序?如果没有,我该如何实现呢?是否有此实现的示例,我一直在搜索Google,但没有取得任何成果。您只需使用
Stream.Synchronized
创建包装器,然后像使用任何其他流一样使用它。将其传递给其他方法,在其上创建StreamReader/Writer等。谢谢!最后一个问题,它是否保持了我写作的顺序?如果没有,我该如何实现这一点呢?我可以看到,也许可以通过某种快速简单的日志功能实现这一点,但这是一个非常好的观点,即使用多线程写入打开的文件句柄可能表明设计模式很差。对于日志编写器来说,队列可能是一种更好的方式。我可以看到,也许可以通过某种快速简单的日志功能来实现这一点,但这是一个非常好的观点,即使用多个线程写入打开的文件句柄可能表明设计模式很差。对于日志编写器,队列可能是更好的方式。