如何使用c#同时运行表单和控制台?

时间:2009-12-31 03:30:57

标签: c# forms console

嘿,我是c#编程语言的新手,并且到目前为止享受了我的经验。我通常在java中开发应用程序,但是对win32库的需求导致我使用c#到目前为止语言似乎相似。但是我目前遇到的一个问题是一段简单的代码,在这个例子中可以得到最好的解释

我正在尝试将一段字符串打印到控制台,然后显示窗体,然后将另一段字符串打印到控制台。但是我得到的结果是打印第一个字符串然后显示表单,然后我必须在打印最后一个字符串之前关闭表单。我想问的问题是,无论如何都要使其工作,以便在显示表单后立即显示第二个打印到控制台。我猜测它与线程有关,但我不完全确定如何实现这个

9 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

听起来您希望能够在显示表单时将消息输出到控制台,对吗?基本问题是,只要表单可见,就必须运行一个消息循环,处理表单的事件。消息循环在Application.Run中,因此一旦调用它,它将不会返回,直到表单关闭(如您所发现)。

因此,如果您希望在表单可见时写入控制台,则可以使用几个选项。正如您所提到的,一个是使用多个线程。让你的主线程运行消息循环,并启动第二个线程来写入控制台。但这不是必需的 - 您也可以直接或间接地在事件处理程序中写入控制台。从按钮单击处理程序中执行Console.WriteLine没有任何问题。或者你可以让你的按钮处理程序在你的Program类中调用一个方法,并在那里写作。

至于哪种解决方案更好,有助于更多地了解您想要实现的目标。我假设您只是想要将内容写入控制台 - 在显示表单时您还想做什么?

答案 2 :(得分:1)

我的建议是从控制台应用程序开始。您始终可以从控制台应用程序中打开WinForm ...这将为您提供您正在寻找的内容。 (你可能也想考虑多线程。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

嘿大家感谢您的回答我在尝试实现的目标方面取得了一些进展,但我不确定它的正确性或线程安全性是我运行的代码

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()); 
        }

    }
}

请告诉我您对此解决方案的看法

答案 5 :(得分:0)

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

form.showDialog()会一直阻止,直到表单关闭,而form.show()则不会。

答案 6 :(得分:0)

我要么从一个控制台应用程序开始,然后从静态main函数运行该应用程序。这是来自内存 - 多年来我一直没有弄乱Winforms:

[STAThread]
static void Main()
{
  Application.Run(new YourMainForm()); 
}

我会重定向Console.Out并将该流推送到某种控件,如文本框或列表框。这是很多代码,但可行...我之前已经写过这个用于现场调试但没有方便的代码。

答案 7 :(得分:0)

为什么不用多行文本框创建一个新的窗体并将其停靠在窗体上,将BackColor设置为Black ForeColor为White,并创建一个公共方法将文本发送到该文本框。

如果您的目标是单一表格申请,那么这项工作非常出色。

答案 8 :(得分:0)

我知道这是一个超级老问题,但我会回答希望业力。如果您使用的是Visual Studio(这是一个相当安全的假设),那么可以使用一个有趣的解决方法。如果在Visual Studio中使用C#启动表单项目,则创建相应的表单,然后将项目类型更改为控制台应用程序(通过右键单击项目 - >属性 - >控制台应用程序),它仍然会产生你的表单,但也会保持一个控制台打开,现在你需要做的就是在创建表单之前放一个Console.Write语句,然后在另一个之后放一个,并且可能添加一个flush语句!