在Microsoft文档中有一个使用DataReceivedEventHandler Delegate的示例。然而,由于所有变量都是静态的,如果我们异步调用SortInputListText()
两次,则会发生冲突,sortOutput
将由两者使用。看起来是个很糟糕的主意。。
-
这错了吗?我错过了什么?
-
文档通常包含很多错误吗?
-
我该怎么做才能避免这种冲突?(我目前正在学习代表、活动等(
private static StringBuilder sortOutput = null; private static int numOutputLines = 0; ... public static void SortInputListText() { ... sortOutput = new StringBuilder(); ... } ... private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { ... sortOutput.Append(Environment.NewLine + $"[{numOutputLines}] - {outLine.Data}"); ... }
这错了吗?我错过了什么?
这是一个代码示例。强调示例。代码示例旨在说明所讨论/解释的主题(在本例中,主题为DataReceivedEventHandler(。代码示例并不意味着生产代码是盲目复制的&粘贴到应用程序中。
这里的这个特定代码示例与异步或并发/并行编程无关。这里的代码示例是关于DataReceivedEventHandler的。没有更多,没有更少。
(不要被代码示例中选择的命名空间名称所混淆。示例命名空间"ProcessAsyncStreamSamples"不是指使用Task和async/wait关键字的典型异步编程,而是指在程序执行其他操作时调用/执行的Output/ErrorDataReceived事件处理程序-在本例中ic代码示例">做其他事情";只是在等待进程退出。(
文档通常包含很多错误吗?
什么???不,一般不会。当然,有一些糟糕而乏味的文档。有时几乎没有任何文档。但也有好的和优秀的文件。我甚至不知道你是怎么来问这个问题的。。。
我应该怎么做才能避免这种冲突?(我目前正在学习代表、活动等(
正如您已经注意到的,静态方法可能不太适合您的应用程序场景。这在代码示例中没有错误或错误,因为代码示例并不意味着是应用程序的一部分(因为它只是一个代码示例(。
如何解决问题的一种可能方法(这不是唯一的方法,但可能相对容易实现和调试(:定义一个封装Process
实例的类、要订阅到进程的Output/ErrorDataReceived事件的处理程序方法,以及特定于进程和/或处理程序的任何数据。通过这种方式,通过拥有此类的单个实例,您可以处理多个进程,每个进程都有自己的Output/ErrorDataReceivedEvent处理程序和数据,而无需每个处理程序或其数据以其他方式获取。(附带说明:由于Process
是IDisposable
,您可能希望您的类也实现IDisposable
…(