如何在多线程MVC建模的应用程序中将控制台输出写入控件?

问题描述 投票:0回答:1

我发现了一种非常简单而优雅的方法,可以通过此link将控制台输出定向到文本框,但是现在我找不到在presenter类中实现它的方法,因此该方法可以在我需要的任何地方使用。这意味着在主线程中,而且在主线程中初始化的所有类中也是如此。

问题是,我在网上找到的类中包含一个将输出定向到的控件(文本框)。在我的主持人班上,我无法定义控件。因此,当我启动演示者线程,然后启动定义了TextWriter的表单时,在表单中生成的输出将按预期方式写入文本框,但是无论何时我在演示者中使用Console.Writeline或在脚本中创建的其他实例中演示者,那么它仍将定向到标准调试输出窗口...

您可能已经看到,我对MVC模型比较陌生。 :)

因此,TextBoxStreamWriter:

public class TextBoxStreamWriter : TextWriter
{
    TextBox _output ;

    public TextBoxStreamWriter(TextBox output)
    {
        _output = output;
    }

    public override void Write(char value)
    {
        MethodInvoker action = 
            delegate 
            {
                _output.AppendText(value.ToString());
            };
        _output.BeginInvoke(action);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}

在我的主持人班上:

public MTMainPresenter(IMTMainForm view)
{
  _view = view;
  HandleShizzle();
  Console.Writeline("Presenter initialized :( "); // << Doesn't work as I want it to...
}

program.cs:

private static MTMainPresenter _presenter;

static void Main()
{
  var mainForm = new MTMainForm();
  _presenter = new MTMainPresenter(mainForm);
  Application.Run(mainForm);
}

以我的形式:

TextWriter _writer = null;

private void Form1_Load(object sender, EventArgs e)
{
  _writer = new TextBoxStreamWriter(txtboxConsole);
  Console.SetOut(_writer);
  Console.Writeline("Yay !"); // << Works fine, the way I want it to
}

因此,基本上,我以生成Console.WriteLine()的形式创建了一个测试按钮,这很好用。但是,当我在演示者中执行相同操作时,它将写入标准调试窗口。我已经尝试过在Procgram.cs类中初始化TextWriter,但是由于它具有TextBox控件,需要分配该控件,因此我对如何解决此问题有些迷惑...

我很确定这很容易解决,但我缺乏经验。

非常感谢P

c# multithreading model-view-controller console controls
1个回答
0
投票

我明白了。在考虑了一段时间并尝试了一些方法之后,我找到了一种方法。可能会有更好的方法,所以如果这不是按照最佳做法进行的,请更正我。 :)但是有效...

我现在可以在任何地方调用Console.WriteLine()(MTMainForm,Presenter,演示者内部的任何自定义对象实例...)。>>

我正在采取的步骤...1.创建表格2.在窗体中,创建链接到控件的编写器3.返回Program.cs,从表单获取创建的编写器4.将输出偏离到编写器5.运行表格...

Program.cs

static void Main()
{
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);

     var mainForm = new MTMainForm();
     TextWriter wrt = mainForm.GetWriter();
     Console.SetOut(wrt);

     _presenter = new MTMainPresenter(mainForm);

     Application.Run(mainForm);
}

MTMainForm:

TextBoxStreamWriter _writer = null;

public MTMainForm()
{
    InitializeComponent();
    _writer = new TextBoxStreamWriter(textBoxConsole);
}

public TextBoxStreamWriter GetWriter()
{
    return _writer;
}

TextBoxStreamWriter:

public class TextBoxStreamWriter : TextWriter
{
    TextBox _output;

    public TextBoxStreamWriter(TextBox output)
    {
        _output = output;
    }

    public override void Write(char value)
    {
        MethodInvoker action =
            delegate
            {
                _output.AppendText(value.ToString());
                if (_output.Text.Length > 4000)
                    _output.Text = _output.Text.Substring(2000, _output.Text.Length - 2000);
            };
        _output.BeginInvoke(action);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.