C#微软文档示例对我来说毫无意义.DataReceivedEventHandler Delegate



在Microsoft文档中有一个使用DataReceivedEventHandler Delegate的示例。然而,由于所有变量都是静态的,如果我们异步调用SortInputListText()两次,则会发生冲突,sortOutput将由两者使用。看起来是个很糟糕的主意。。

  1. 这错了吗?我错过了什么?

  2. 文档通常包含很多错误吗?

  3. 我该怎么做才能避免这种冲突?(我目前正在学习代表、活动等(

    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"不是指使用Taskasync/wait关键字的典型异步编程,而是指在程序执行其他操作时调用/执行的Output/ErrorDataReceived事件处理程序-在本例中ic代码示例">做其他事情";只是在等待进程退出。(

文档通常包含很多错误吗?

什么???不,一般不会。当然,有一些糟糕而乏味的文档。有时几乎没有任何文档。但也有好的和优秀的文件。我甚至不知道你是怎么来问这个问题的。。。

我应该怎么做才能避免这种冲突?(我目前正在学习代表、活动等(

正如您已经注意到的,静态方法可能不太适合您的应用程序场景。这在代码示例中没有错误或错误,因为代码示例并不意味着是应用程序的一部分(因为它只是一个代码示例(。

如何解决问题的一种可能方法(这不是唯一的方法,但可能相对容易实现和调试(:定义一个封装Process实例的类、要订阅到进程的Output/ErrorDataReceived事件的处理程序方法,以及特定于进程和/或处理程序的任何数据。通过这种方式,通过拥有此类的单个实例,您可以处理多个进程,每个进程都有自己的Output/ErrorDataReceivedEvent处理程序和数据,而无需每个处理程序或其数据以其他方式获取。(附带说明:由于ProcessIDisposable,您可能希望您的类也实现IDisposable…(

最新更新