异步代码给上:
Imports System.IO
Imports System.Threading
''' <summary>
''' 此类实现将程序实现重定位输入和输出(异步方式读取)
''' </summary>
''' <remarks></remarks>
Public Class Shell_exe
#Region "声明"
Implements IDisposable
Dim CmdPcs As New Process
Dim Displayer As TextBoxBase = Nothing
Dim file_name As String = String.Empty
Protected disposed As Boolean = False
Private Delegate Sub Write(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
#End Region
#Region "构造和析构"
Public Sub New(ByRef filename As String)
file_name = filename
End Sub
Public Sub New(ByRef filename As String, ByRef sender As TextBoxBase)
file_name = filename
Displayer = sender
End Sub
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
CmdPcs.CancelErrorRead()
CmdPcs.CancelOutputRead()
CmdPcs = Nothing
file_name = Nothing
End If
Displayer = Nothing
End If
Me.disposed = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
#End Region
#Region "方法"
Public Function Shell(ByRef sender As Object, ByRef sw As StreamWriter) As Boolean
Displayer = sender
Shell(sw)
End Function
Public Sub Shell(ByRef sw As StreamWriter)
Try
CmdPcs = New Process
With CmdPcs.StartInfo
.FileName = file_name
.UseShellExecute = False
.CreateNoWindow = True
' .WindowStyle = ProcessWindowStyle.Hidden
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
CmdPcs.Start()
sw = CmdPcs.StandardInput
CmdPcs.BeginErrorReadLine()
CmdPcs.BeginOutputReadLine()
AddHandler CmdPcs.ErrorDataReceived, AddressOf Output
AddHandler CmdPcs.OutputDataReceived, AddressOf Output
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Public Sub Kill()
Try
CmdPcs.Kill()
Catch ex As Exception
End Try
End Sub
Private Sub Output(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
Try
If Not String.IsNullOrEmpty(e.Data) Then
If Displayer.InvokeRequired Then
Displayer.Invoke(New Write(AddressOf Output), sender, e)
Else
Displayer.AppendText(e.Data & vbCrLf)
Displayer.ScrollToCaret()
End If
End If
Catch ex As Exception
End Try
End Sub
#End Region
End Class
其实上面的代码基本满足我的需要,就是当程序提示要输入数据时,没有提示语言,
因为DataReceivedEventArgs只有当有回车符号时,才触发,所以就没有提示语言,
只有输入数据后,提示语言跟数据一起显示.