如何使用c#同时运行窗体和控制台?

如何使用c#同时运行窗体和控制台?,c#,forms,console,C#,Forms,Console,嘿,我对c#编程语言相当陌生,到目前为止,我很享受我的经历。我通常用java开发应用程序,但由于需要win32库,我选择了c语言,到目前为止,这两种语言似乎比较相似。然而,我目前遇到的一个问题是一段简单的代码,在本例中可以得到最好的解释 我正在尝试将一段字符串打印到控制台,然后显示windows窗体,然后将另一段字符串打印到控制台。然而,我得到的结果是打印第一个字符串,然后显示表单,然后我必须在打印最后一个字符串之前关闭表单。我想问的问题是,是否有任何方法可以使此工作正常,以便在显示表单后立即显

嘿,我对c#编程语言相当陌生,到目前为止,我很享受我的经历。我通常用java开发应用程序,但由于需要win32库,我选择了c语言,到目前为止,这两种语言似乎比较相似。然而,我目前遇到的一个问题是一段简单的代码,在本例中可以得到最好的解释


我正在尝试将一段字符串打印到控制台,然后显示windows窗体,然后将另一段字符串打印到控制台。然而,我得到的结果是打印第一个字符串,然后显示表单,然后我必须在打印最后一个字符串之前关闭表单。我想问的问题是,是否有任何方法可以使此工作正常,以便在显示表单后立即显示第二个打印到控制台。我猜这与线程有关,但我不完全确定如何实现这一点,我的建议是从控制台应用程序开始。您始终可以从控制台应用程序打开WinForm…这将为您提供所需的内容。(您可能还需要考虑多线程。

您使用的是
form.showDialog()
还是
form.show()


form.showDialog()
将一直阻止,直到表单关闭,而
form.show()
将不会阻止。我要么从控制台应用程序开始,然后从静态主函数运行应用程序。这是从内存中获得的-我已经多年没有使用Winforms了:

static class Program
{
    [STAThread]
    static void Main()
    {
        Console.WriteLine("first string");
        var form = new Form1();
        form.Show();
        Console.WriteLine("the second string");
        Application.Run();
    }
}
[STAThread]
static void Main()
{
  Application.Run(new YourMainForm()); 
}


我会重定向控制台。将该流导出并推入某种控件,如文本框或列表框。这是很多代码,但可行…我以前编写过这些代码用于现场调试,但手边没有这些代码。

大家好,谢谢你们的回答。我在尝试实现这些方面取得了一些进展,但我不确定如何正确t或线程安全这是我要运行的代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;

    namespace Project1
    {
    class Class2
    {

        [STAThread]
        static void Main()
        {
           Console.WriteLine("hello");
           Class2 t = new Class2();
           t.test();
           Console.WriteLine("second string");
        }



        public void test()
        {
            Thread t = new Thread(new ThreadStart(StartNewStaThrea));
            t.Start();
        }


        private void StartNewStaThrea()
        { 
            Application.Run(new Form1()); 
        }

    }
}

请告诉我您对该解决方案的看法。听起来您希望能够在显示表单时将消息输出到控制台,对吗?基本问题是,只要表单可见,就必须有一个消息循环在运行,处理表单的事件。消息循环在应用程序内。请运行,一旦如果您调用它,它将在表单关闭之前不会返回(如您所发现的)

因此,如果您希望在窗体可见时写入控制台,您有两个选项。如您所述,其中一个选项是使用多个线程。让主线程运行消息循环,并启动第二个线程写入控制台。但这不是必需的——您也可以从事件处理程序中直接写入控制台或者间接地。从按钮单击处理程序中执行Console.WriteLine没有错。或者,您可以让按钮处理程序调用程序类中的方法,并在那里进行编写


至于哪种解决方案更好,了解更多您想要完成的任务会有所帮助。我假设您不只是想在控制台上写东西——在显示表单时,您还想做什么?

为什么不创建一个带有多行文本框的新windows表单,并将其固定到表单上,然后设置BackColor为黑色,ForeColor为白色,并创建一个公共方法将文本发送到该文本框


如果你的目标是一个单一表单的应用程序,那么这将非常出色。

我知道这是一个非常古老的问题,但我将回答这个问题,希望能带来报应。如果你使用Visual Studio(这是一个相当安全的假设),一个有趣的解决方法会很好地解决这个问题。如果在Visual Studio的C#中启动表单项目,则制作适当的表单,然后将项目类型更改为控制台应用程序(通过右键单击项目-->属性-->控制台应用程序),它仍然会生成您的表单,但也会保持控制台打开,现在您需要做的就是放置一个控制台。在创建表单之前编写语句,在创建表单之后编写语句,或者添加一个flush语句!

解决方案非常简单:
只需创建一个Windows窗体应用程序(在创建项目时,您可能已经创建了),然后转到属性(在上下文菜单“项目”中,它是最后一项),并将“输出类型”设置为“控制台应用程序”。表单将像以前一样工作,而且应用程序现在也将打开控制台。然后,您可以自由地向控制台写入或从控制台读取。

是否有代码向我们显示?此代码可以工作,但我正在尝试让第二个字符串出现在应用程序之后。run();我遇到的问题是,应用程序必须在出现之前关闭。好吧,如果你问我的话,这只是一个骗局……但是,你可以在窗体关闭时调用application.Exit,然后修改Main(),如下所示:Console.WriteLine(“第一个字符串”);var form=new Form1();form.Show();application.Run();Console.WriteLine(“第二个字符串”);Application.Run();然后,您将只剩下控制台窗口显示两个字符串。我已开始使用控制台应用程序。我认为解决方案可能在于多线程。感谢您的帮助注意:您应该使用此信息编辑原始问题,而不是将其作为答案发布。抱歉,Rob,我将为将来保留此注释Hi Aaron谢谢r您的回答,这确实是我试图实现的。到目前为止,我已经通过线程化的想法实现了一些基本的功能。我在这里发布了一个答案,让我知道您的想法。我试图实现的是一个遵循MVC设计模式的应用程序。创建这些应用程序时,我喜欢从mo的实例开始del和从驱动程序类创建的视图,尽管这可能是一种不好的做法,因为这里应该很少有代码来处理应用程序。您不应该仅仅为了实现MVC体系结构而使用线程(我会提醒您不要使用线程,除非您必须这样做,否则