Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace IOProxy
- {
- internal class AsyncIO
- {
- protected static readonly TaskFactory MyTaskFactory = new TaskFactory();
- protected Task MyTask;
- protected CancellationTokenSource CancelToken;
- protected TextReader Reader;
- protected TextWriter Writer;
- public AsyncIO(TextReader Reader, TextWriter Writer)
- {
- this.Reader = Reader;
- this.Writer = Writer;
- }
- public void StartAsyncTask()
- {
- this.CancelToken = new CancellationTokenSource();
- this.MyTask = Task.Run(() => this.AsyncTask(), this.CancelToken.Token);
- }
- private void AsyncTask()
- {
- for(;;)
- {
- try
- {
- var OneChar = this.Reader.Read();
- this.Writer.Write((char)OneChar);
- Debug.WriteLine("Input {0}", (uint)OneChar);
- }
- catch(Exception)
- {
- }
- }
- }
- public void Cancel()
- {
- try
- {
- CancelToken.Cancel();
- //this.MyTask.Wait();
- }
- catch(AggregateException)
- {
- }
- this.CancelToken = null;
- this.MyTask = null;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Console.Out.WriteLine("© 2014 alice");
- if(args.Length < 1)
- {
- Console.Out.WriteLine("No program name to execute.");
- return;
- }
- // 引数はすべて子プロセスに渡す
- var ChildProcess = new Process();
- var Arguments = new string[args.Length - 1];
- Array.Copy(args, 1, Arguments, 0, Arguments.Length);
- for(int i = 0; i < Arguments.Length; i++)
- {
- if(Arguments[i].Contains(" "))
- {
- Arguments[i] = "\"" + Arguments[i] + "\"";
- }
- }
- ChildProcess.StartInfo.FileName = args[0];
- ChildProcess.StartInfo.Arguments = string.Join(" ", Arguments);
- ChildProcess.StartInfo.UseShellExecute = false;
- // 標準入出力ハンドルをこのプロセスから引き継がせるようにする
- ChildProcess.StartInfo.RedirectStandardInput = true;
- ChildProcess.StartInfo.RedirectStandardOutput = true;
- ChildProcess.StartInfo.RedirectStandardError = true;
- // 子プロセスの出力(こちらでの読み込む時に)をUTF-8として解釈するように指定する
- ChildProcess.StartInfo.StandardErrorEncoding = Encoding.UTF8;
- ChildProcess.StartInfo.StandardOutputEncoding = Encoding.UTF8;
- ChildProcess.OutputDataReceived += ChildProcess_OutputDataReceived;
- ChildProcess.ErrorDataReceived += ChildProcess_ErrorDataReceived;
- try
- {
- ChildProcess.Start();
- }
- catch(Exception e)
- {
- Console.Out.WriteLine("Exception {0}!", e);
- ChildProcess = null;
- }
- if(ChildProcess == null)
- {
- return;
- }
- ChildProcess.BeginErrorReadLine();
- ChildProcess.BeginOutputReadLine();
- //var AsyncStdOut = new AsyncIO(ChildProcess.StandardOutput, Console.Out);
- //var AsyncStdErr = new AsyncIO(ChildProcess.StandardError, Console.Error);
- var AsyncStdIn = new AsyncIO(Console.In, ChildProcess.StandardInput);
- //ChildProcess.StandardInput.Encoding = Encoding.UTF8;
- //AsyncStdOut.StartAsyncTask();
- //AsyncStdErr.StartAsyncTask();
- AsyncStdIn.StartAsyncTask();
- ChildProcess.WaitForExit();
- //AsyncStdOut.Cancel();
- //AsyncStdErr.Cancel();
- AsyncStdIn.Cancel();
- //ChildProcess.StandardError.Close();
- //ChildProcess.StandardOutput.Close();
- ChildProcess.StandardInput.Close();
- }
- static void ChildProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
- {
- Console.Error.WriteLine(e.Data);
- }
- static void ChildProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
- {
- Console.Out.WriteLine(e.Data);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement