嘿,我是c#编程语言的新手,并且到目前为止享受了我的经验。我通常在java中开发应用程序,但是对win32库的需求导致我使用c#到目前为止语言似乎相似。但是我目前遇到的一个问题是一段简单的代码,在这个例子中可以得到最好的解释
我正在尝试将一段字符串打印到控制台,然后显示窗体,然后将另一段字符串打印到控制台。但是我得到的结果是打印第一个字符串然后显示表单,然后我必须在打印最后一个字符串之前关闭表单。我想问的问题是,无论如何都要使其工作,以便在显示表单后立即显示第二个打印到控制台。我猜测它与线程有关,但我不完全确定如何实现这个
答案 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语句!